【LeetCode 0-Start】[数组]数组遍历
文章目录
前言
数组的遍历
题目序号: 485、495、414、628
一、[简单]485. 最大连续1的个数
题目来源
算法思想:滑动窗口,数组;
java代码
class Solution {
public int findMaxConsecutiveOnes(int[] nums) {
int max = nums[0];//最大连续1的数量
for(int i = 1; i < nums.length; i++){
if(nums[i] == 0){
//如果是0,则不纳入计算
continue;
}
else{
//如果是1,则叠加计算
nums[i] += nums[i-1];//叠加计算
if(max < nums[i]){
//记录最大值
max = nums[i];
}
}
}
return max;
}
}
二、[中等]495. 提莫攻击
题目来源
算法思想:滑动窗口,数组;
思路:计算每一个时刻 i 截止,寒冰射手会中毒的时间,遍历一遍
java代码
class Solution {
public int findPoisonedDuration(int[] timeSeries, int duration) {
int sum = 0;
//数组为空,提莫不攻击,中毒时间为0
if (timeSeries.length == 0) {
return 0;
}
//遍历数组,计算每个时刻 i 截止,中毒时间
for (int i = 1; i < timeSeries.length; i++) {
//i 时刻,如果<当前时刻>-<前一时刻>小于中毒时间,
//在i时刻,提莫重新攻击,中毒时间刷新,
//即在i时刻之前,中毒时间是sum + timeSeries[i] - timeSeries[i-1]
if (timeSeries[i] - timeSeries[i-1] < duration) {
sum += timeSeries[i] - timeSeries[i-1];
}
//如果如果<当前时刻>-<前一时刻>大于中毒时间,
//即在i时刻之前,中毒时间是duration
else {
sum += duration;
}
}//遍历结束,即 timeSeries.length-1 截止时刻之前的中毒时间计算完毕
//最后的timeSeries[length-1]提莫还会攻击
//所以最后的时间还要加上+ duration
return sum + duration;
}
}
三、[简单]414. 第三大的数
题目来源
算法思想:数组;
java代码
class Solution {
public int thirdMax(int[] nums) {
//第一大的数,标志index:是否被修改
int max = Integer.MIN_VALUE;
int index = -1;
//第二大的数,标志index2:是否被修改
int max2 = Integer.MIN_VALUE;
int index2 = -1;
//第三大的数,标志index3:是否被修改
int max3 = Integer.MIN_VALUE;
int index3 = -1;
//找到最大的数
for (int i = 0; i < nums.length; i++) {
if(nums[i] >= max) {
max = nums[i];
index = i;
}
}
//如果数组长度<3,不可能有第三大的数,直接返回最大数
if(nums.length < 3) {
return max;
}
//寻找第二大的数
for (int i = 0; i < nums.length; i++) {
if(nums[i] >= max2 && nums[i] != max) {
max2 = nums[i];
index2 = i;
}
}
//寻找第三大的数
for (int i = 0; i < nums.length; i++) {
if(nums[i] >= max3 && nums[i] != max && nums[i] != max2) {
max3 = nums[i];
index3 = i;
}
}
//区别{1,1,2}没有第三大
//{1,2,Integer.MIN_VALUE}有第三大
//判断是否发生了修改,修改即有第三大的数,如果没有.则返回最大数
if(index3 != -1){
return max3;
}
return max;
}
}
四、[简单]628. 三个数的最大乘积
题目来源
算法思想:排序,数组;
java代码
class Solution {
public int maximumProduct(int[] nums) {
Arrays.sort(nums);//排序,从小到大
int len = nums.length;
int res1 = nums[len-3]*nums[len-2]*nums[len-1];//取排序后最后三个数
int res2 = nums[0]*nums[1]*nums[len-1];//前两个负数(可能)+最后一个最大的数
return Math.max(res1, res2);//比较,输出最大的数
}
}