给定一个长度为 n 的非空整数数组,找到让数组所有元素相等的最小移动次数。每次移动可以使 n - 1 个元素增加 1。
示例:
输入:
[1,2,3]输出:
3解释:
只需要3次移动(注意每次移动会增加两个元素的值):[1,2,3] => [2,3,3] => [3,4,3] => [4,4,4]
本题思路;看移动次数,并且在int型,还有n个数这么大肯定不注意得超时,故会有一定技巧型 ,我开始用递归,调用次数太多了变成死递归了,后面改成最大数字见最小的数字,在移动,最后其实移动次数就是排序后的数字与第一个最小数字之差的和就是移动次数。
public class leetcode453 {
//这不能定义在递归函数里。不然每次递归调用就又初始化值了
public static int res=0;
public static void main(String[] args) {
int[] nums = new int[] {1,2};
int arr= minMoves(nums);
System.out.println(arr);
}
public static int minMoves(int[] nums) {
///这个递归做个规定小数字内还可以,不然死递归
// if(nums.length ==1) {
// return 0;
// }
// Arrays.sort(nums);
// int k=0;
// for (int i=0;i<nums.length-1;i++) {
// if (nums[i] == nums[nums.length-1]){
// k++;
// }
// }
// while (k !=nums.length-1) {
// //我这不一次次移动,先找最大与最先差距这样移动过
// /**
// * 其实这里你大体就发现了循环的移动就是所有数与排序后第一个数的差
// */
// int arr = nums[nums.length-1]-nums[0];
// for (int i=0;i<nums.length-1;i++) {
// nums[i] =nums[i]+arr;
// }
// res=res+arr;
// minMoves(nums);
// return res;
// }
// return res;
/**
* 移动次数就是这些排序数后之差
*/
Arrays.sort(nums);
int res = 0;
for (int i = nums.length - 1; i > 0; i--) {
res += nums[i] - nums[0];
}
return res;
}
}
还有其他方法