题目分析:在题目中要求每次将数组中的n-1个元素增加1,直到每个元素相等,返回最小的操作次数。这里很明显每次操作中不变的肯定是最大的那一个数,所以我们首先要想明白我们要如何将最大数找出,然后对每个其它的元素进行增加,循环上面的操作,直到所有的元素相等,但是如果用上面这种思路的话不仅代码量较大,且代码的运行效率较低,在LeetCode中肯定也会因为运行超时提交失败,所以下面的核心思想会介绍一种简便的方法。
核心思想:我们可以从另一种角度进行思考本题,每次操作都会对除了最大元素以外的元素进行加一,这对于总体来说就相当于将最大元素减一,这样的话每次操作中就只需要对一个元素进行操作,就不需要对其它元素进行操作,并且将其它元素增大的话我们还需要考虑最大值不止一个,这样的话每次操作中都需要重新寻找最大值,但是我们如果只需要找到最小值的话我们就只需要计算其它值减小到最小值需要的操作步骤就行了,不需要每次都对最小值进行寻找,这样的话大大的提高了代码的运行效率。下面是代码的书写步骤
首先我们需要将最小值找出,将最小值找出的话我们可以采用for循环遍历一遍数组将最小值找出就行
int min=nums[0];
for(int i=1;i<nums.length;i++)
{
if(nums[i]<min)
{
min=nums[i];
}
}
我们也可以使用另一种方法就是使用Arrays.sort()方法对数组进行排序,数组的第一个元素就是最小值,这样会简化书写过程,在LeetCode中的很多其它题目使用这个方法可以提高代码的运行效率,这里使用任何一种方法就行
Arrays.sort(nums);//排序
在计算操作数的时候我们只需要计算所有大于最小元素的元素与最小元素的差值的和就行了,这里就使用for循环就可以计算得出了
for(int i=1;i<nums.length;i++)
count+=nums[i]-nums[0];
这里我采用的是使用Arrays.sort()方法最数组排序找到的最小值,所以数组第一个数就是最小值。
这里因为其它数是大于等于nums[0]的,所以nums[i]-nums[0]大于等于0,所以这里就不需要进行
nums[i]>nums[0]的判断了。
下面是整体代码:
class Solution
{
public int minMoves(int[] nums)
{
/*每次除了最大值其他的值都需要加一,最大值与其他最小值的差减小1,所以相当于最大值减小一
所以需要计算所有值减小到最小值的次数*/
int count=0;
Arrays.sort(nums);//排序
if(nums[nums.length-1]!=nums[0])
{
for(int i=1;i<nums.length;i++)
count+=nums[i]-nums[0];
}
//首位相等则代表数组原本就相等,所以直接返回count;
return count;
}
}
在这里我是使用的Arrays.sort对数组进行排序来找到的最小值,所以这里我考虑了一种特殊情况就是所有元素相等,操作数为0的情况,这样的话我们只需要对数组第一个元素和最后一个元素进行对比,相等的话就是所有元素相等,直接返回0就可以了,不相等的话在进行下面的计算操作。