> 文章列表 > 453. 最小操作次数使数组元素相等|||665. 非递减数列

453. 最小操作次数使数组元素相等|||665. 非递减数列

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

这个讲解我看明白了。