🎉🎉🎉写在前面:
博主主页:🌹🌹🌹戳一戳,欢迎大佬指点!
博主秋秋:QQ:1477649017 欢迎志同道合的朋友一起加油喔💪
目标梦想:进大厂,立志成为一个牛掰的Java程序猿,虽然现在还是一个小菜鸟嘿嘿
-----------------------------谢谢你这么帅气美丽还给我点赞!比个心-----------------------------
题号:485,最大连续1的个数
class Solution {
public int findMaxConsecutiveOnes(int[] nums) {
int count = 0;
int max = 0;
for(int i = 0;i < nums.length;i++){
if(nums[i] == 1){
count++;
}else{
count = 0;
}
if(count > max){
max = count;
}
}
return max;
}
}
这个题考察的就是数组的遍历以及你的观察能力,注意这是一个二进制的一维数组,正如提示里面所言,数组元素它不是0就是1,那我们要统计连续1的个数,遇到1就把count++,并且同步保存到max里面,如果数组元素为0了,就把count清零,又重新继续往后统计,当然之前max还是一直存储着遇到0之前的连续1的个数,后面只要又实时比较更新max就好了。
题号:495,提莫攻击
class Solution {
public int findPoisonedDuration(int[] timeSeries, int duration) {
int ret = 0;
int end = 0;//记录理论上的中毒结束时间
for(int i = 0;i < timeSeries.length;i++){
if(timeSeries[i] >= end){
ret += duration;
}else{
ret += timeSeries[i] + duration - end;
}
end = timeSeries[i] + duration;
}
return ret;
}
}
其实这个问题也不要想的太过于复杂,就是一个中毒时间累加计算的问题,唯一需要我们注意的就是重置中毒效果的问题。我们每次收到一次攻击,中毒的时间就会是duration,所以我们先不考虑我们中间时间会有重叠的情况,先把所有的duration加起来,然后再把每次的重叠的部分减去,那最后就是我们的实际中毒时间了。
那把这个想法放到每一次攻击上,end是记载我们的理论中毒结束时间(不考虑中间受到攻击,以及end这个时刻其实不是中毒状态的),所以我们的
timeSeries[i] >= end,那就不存在什么中间有重叠的情况,直接攻击了多少次,把duration累加就好,当然每算一次end就会更新,当不满足timeSeries[i] >= end这个条件的时候,就说明在中毒生效的时间段类受到了攻击,所以这个时候按理来说我们的中毒时间就不能再单纯加上duration了,因为此时的攻击时间与上一次的中毒时间是重叠的,这个部分是必须要减掉的,那这个重叠的部分怎么算,就是timeSeries[i] - end,这个算出来结果就是负的,加上的效果就是减了。
题号:414,第三大的数
class Solution {
public int thirdMax(int[] nums) {
if(nums.length == 1){
return nums[0];
}
if(nums.length == 2){
return (nums[0] > nums[1]) ? nums[0] : nums[1];
}
Arrays.sort(nums);
int ret = 0;
int count = 0;
int tmp = Integer.MAX_VALUE;
for(int i = nums.length - 1 ;i >= 0;i--){
if(nums[i] != tmp){
count++;
}
tmp = nums[i];
if(count == 3){
break;
}
}
if(count == 3){
return tmp;
}else{
return nums[nums.length - 1];//数组没有第三大的数字,例如 2 2 2 2 2 8;
}
}
}
先单独列两种特殊的情况,数组只有两个数,或者数组只有一个数,这个时候求第三大的数都是比较简单的。排除这两种情况外,先把数组排序,这样数组就是按从小到大的顺序排列的,从数组的末尾开始遍历,只要不和tmp相等,我们的计数变量count++,直至找到那个第三大的数。利用到count的原因就是因为元素有重复的可能,所以我们排序好了,倒数第三个数并不一定是第三大的数。
题号:628,三个数最大乘积
✅题目传送门,戳戳开始解题>>
class Solution {
public int maximumProduct(int[] nums) {
// 三个指针遍历的做法效率太低
Arrays.sort(nums);
int n = nums.length - 1;
return Math.max(nums[0]*nums[1]*nums[n],nums[n-2]*nums[n-1]*nums[n]);
}
}
先将数组排序,乘积最大有三种情况:
1,数组后三个数全是正数,那乘积最大就是就是这后三个数的乘积。
2,数组后三个数全是负数,那乘积最大也是最后三个数的乘积。负数的大小比较与正数相反
3,数组最后三个数里面有正有负,那就只能是最小的两个负数与最大的正数的乘积。
所以综合考量,那就是整合一下用Math.max求最大值就好,就包含了以上的情况。
最后,今天的文章分享比较简单,就到这了,如果大家觉得还不错的话,还请帮忙点点赞咯,十分感谢!🥰🥰🥰