453. 最小操作次数使数组元素相等|||665. 非递减数列
453 最小操作次数使数组元素相等
题目
给你一个长度为 n 的整数数组,每次操作将会使 n - 1 个元素增加 1 。返回让数组所有元素相等的最小操作次数。
代码
class Solution {public int minMoves(int[] nums) {if (nums == null || nums.length == 0){return 0;}int sum=0;int min = Arrays.stream(nums).min().getAsInt();for (int i:nums)sum+=i-min;return sum; }
}
思考
感觉有窍门,但没想出来。
我想到的:
每次从小到大排序,将前n-1个数+1,判断每个元素是否与其他元素相等。
然后重复此过程,统计操作了几次
大佬们:
将n - 1 个元素增加 1等同于让每次有一个数自减1,想让数组所有元素相等,即所有数都减到和最小元素相等。所以最小操作次数为每个元素-最小元素之和。
665. 非递减数列
题目
给你一个长度为 n 的整数数组 nums ,请你判断在 最多 改变 1 个元素的情况下,该数组能否变成一个非递减数列。
我们是这样定义一个非递减数列的: 对于数组中任意的 i (0 <= i <= n-2),总满足 nums[i] <= nums[i + 1]。
代码
class Solution {public boolean checkPossibility(int[] nums) {int flag=0;for(int i=0;i<nums.length-1;i++ ){if(nums[i]>nums[i+1]){flag++;if(i==0)nums[i]=nums[i+1];else if(nums[i+1]<nums[i-1])nums[i+1]=nums[i];else nums[i]=nums[i-1];} if(flag>1)return false; }return true;}
}
思考
刚开始思路:
比较nums[i]和nums[i+1]的大小,如果出现两次nums[i]>nums[i+1]则为假。
没通过 3 4 2 3
想了半天也没想出来怎们办,去看了讲解(⊙o⊙)…
当i=0时候,只能修改第一个元素,保证是递减的,比如2 1 1只能修改成1 1 1而不能修改成2 2 1
当i!=0时候,就需要判断是修改位置i还是位置i+1
当nums[i+1]>=nums[i-1]时,将 nums[i]修改为nums[i-1]。比如2 4 3 -> 2 2 3
当nums[i+1]< nums[i-1]时,将 nums[i+1]修改为nums[i]。比如3 4 2->3 4 4
可以循环中条件改才,当修改次数大于等于2直接返回false,代码末返回true
作者:quirky-i3an2aiomg
这个讲解我看明白了。