最少操作使数组递增
题目:
我们考虑严格递增,首先先考虑特殊情况,数组只有一位的话他就是严格递增的,所以直接返回就可以了,之后的数据我们就要进行遍历判断。严格递增,那就说明下一个数一定是大于上一个数的,如果下一个数字小于上一个数字,那就把下一个数字+1,直到大于上一个数为止。 这样这道题的思路就有了
代码如下:
public int minOperations(int[] nums) {
//定义长度
int length = nums.length;
//定义计数器
int counter = 0;
//长度为1的特殊情况
if(length==1){
return 0;
}
//外循环确定数组遍历完了
for(int i=1;i<length;i++){
//获取现在的和上一个数
int curr = nums[i];
int prev = nums[i-1];
//比上一个小就+1
while(curr<=prev){
curr++;
nums[i]=curr;
counter++;
}
}
return counter;
}
leetcode执行结果:
显然这个结果明显不是优秀的,那么考虑优化的就是里面的双重循环。 所以不再循环的情况下怎么判断增加次数呢,实际是可以的,操作的最小次数就是把下一个数字增加到上一个数+1的次数,也就是(num【n+1】= num【n】+1)比如数组【2,8,5,10】,我们只需要把5增加到(8+1)就可以了,增加次数就是(8+1-5)=4。 这样新的思路就很明显了
代码如下:
class Solution {
public int minOperations(int[] nums) {
//定义计数器
int counter = 0;
//定义最大值为第0位
int max = nums[0];
//数组只有一位的特殊情况
if(nums.length==1){
return 0;
}
//循环遍历数组
for(int i=1;i<nums.length;i++){
//现在的值小于最大值
if(nums[i]<=max){
//计数器要增加max-nums[i]+1次才满足需求
counter = counter+(max-nums[i]+1);
nums[i]=max+1;
max=nums[i];
//大于最大值就直接最大值变成现在的数
}else{
max=nums[i];
}
}
return counter;
}
}
leetcode执行结果:
当然应该还能有更好的结果,就不再去考虑了