力扣数组篇
485.给定一个二进制数组 nums , 计算其中最大连续 1 的个数。
思路:遍历数组,当遇到1的时候就计数+1,否则就清零,保存最大值。最后将最大值返回即可。
public class FindMaxConsecutiveOnes {
public static void main(String[] args) {
int[] nums = {1,1,0,1,1,1,1};
System.out.println(findMaxConsecutiveOnes(nums));
}
public static int findMaxConsecutiveOnes(int[] nums){
int len = nums.length;
int count = 0;
int max = 0;
for (int i = 0; i < len; i++) {
if (nums[i] == 1){
count++;
}else{
max = max > count ? max : count;
count = 0;
}
}
max = max > count ? max : count;
return max;
}
}
495.在《英雄联盟》的世界中,有一个叫 “提莫” 的英雄。他的攻击可以让敌方英雄艾希(编者注:寒冰射手)进入中毒状态。
当提莫攻击艾希,艾希的中毒状态正好持续 duration 秒。
正式地讲,提莫在 t 发起发起攻击意味着艾希在时间区间 [t, t + duration - 1](含 t 和 t + duration - 1)处于中毒状态。如果提莫在中毒影响结束 前 再次攻击,中毒状态计时器将会 重置 ,在新的攻击之后,中毒影响将会在 duration 秒后结束。
给你一个 非递减 的整数数组 timeSeries ,其中 timeSeries[i] 表示提莫在 timeSeries[i] 秒时对艾希发起攻击,以及一个表示中毒持续时间的整数 duration 。
返回艾希处于中毒状态的 总 秒数。
思路:①如果当前时间+中毒时间 <= 下一时间 说明没有重叠 中毒总秒数 sum = sum + duration;
②如果当前时间+中毒时间 > 下一时间 说明有重叠 中毒总秒数 sum = sum +下一时间 - 当前时间 ;
③最后到最后的中毒开始时间时无论怎样都需要加一个duration
public class FindPoisonedDuration {
public static void main(String[] args) {
int[] arr = {1,2,3};
System.out.println(findPoisonedDuration(arr,2));
}
public static int findPoisonedDuration(int[] timeSeries, int duration) {
int sum = 0;
for (int i = 0; i < timeSeries.length - 1; i++) {
if (timeSeries[i] + duration <= timeSeries[i+1]){
sum = sum + duration;
}else{
sum = sum + timeSeries[i+1] - timeSeries[i];
}
}
return sum + duration;
}
}
414.给你一个非空数组,返回此数组中 第三大的数 。如果不存在,则返回数组中最大的数。
思路:可以考虑用TreeSet(是一个有序的二叉树)并且Set存放的元素是不可重复的。所以把数组中的数放到TreeSet中,若有序集合的大小为 3,其最小值就是数组中第三大的数;若有序集合的大小不足 33,那么就返回有序集合中的最大值。
public class ThirdMax {
public static void main(String[] args) {
int[] nums = {2,2,1,4,3};
System.out.println(thirdMax(nums));
}
public static int thirdMax(int[] nums) {
TreeSet<Integer> treeSet = new TreeSet<>();
for (int s : nums){
treeSet.add(s);
if (treeSet.size()>3){
treeSet.remove(treeSet.first());
}
}
return treeSet.size()==3?treeSet.first():treeSet.last();
}
}
628.给你一个整型数组 nums ,在数组中找出由三个数组成的最大乘积,并输出这个乘积。
思路:想要求最大的乘积分三种情况:
①数组中全部都是正数,则最大乘积就是取最大的三个数
②数组中全部都是负数,则最大的乘积也是取最大的三个数
③数组中有正有负,则最大的乘积就是取三个最大的正数,或者是最大的正数和最小的两个负数
public class MaximumProduct {
public static void main(String[] args) {
int[] nums = {1,2,3};
System.out.println(maximumProduct(nums));
}
public static int maximumProduct(int[] nums) {
Arrays.sort(nums);
int n = nums.length;
return Math.max(nums[0]*nums[1]*nums[n-1],nums[n-1]*nums[n-2]*nums[n-3]);
}
}