【LeetCode 0-Start】[数组]数组遍历

【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);//比较,输出最大的数
    }
}

猜你喜欢

转载自blog.csdn.net/qq_39457586/article/details/108757745