Easy-29

来源:互联网 发布:抽奖软件可内定 编辑:程序博客网 时间:2024/05/22 08:28

leetcode    453. Minimum Moves to Equal Array Elements          

Given a non-empty integer array of size n, find the minimum number of moves required to make all array elements equal, where a move is incrementingn - 1 elements by 1.

Example:

Input:[1,2,3]Output:3Explanation:Only three moves are needed (remember each move increments two elements):[1,2,3]  =>  [2,3,3]  =>  [3,4,3]  =>  [4,4,4]

RT:

int maxIndex(int* nums,int numsSize)
{
    int max=0;
    for(int i=1;i<numsSize;i++)
    {
        if(nums[i]>nums[max])
        {
            max=i;
        }
    }
    return max;
}
bool isequal(int* nums,int numsSize)
{
    int max=0;
    for(int i=1;i<numsSize;i++)
    {
        if(nums[i]!=nums[max])
        {
            return false;
        }
    }
    return true;
}
int minMoves(int* nums, int numsSize) {
    int flag=1;
    int result=0;
    if(isequal(nums,numsSize))
    {
        flag=0;
    }
    while(flag)
    {
        int k=maxIndex(nums,numsSize);
        for(int i=0;i<numsSize;i++)
        {
            if(i!=k)
            {
                nums[i]++;
            }
        }
        result++;
        if(isequal(nums,numsSize))
        {
            flag=0;
        }      
    }
    return result;
}

WA:

int maxIndex(int* nums,int numsSize)
{
    int max=0;
    for(int i=1;i<numsSize;i++)
    {
        if(nums[i]>nums[max])
        {
            max=i;
        }
    }
    return max;
}
int minMoves(int* nums, int numsSize) {
    if(numsSize==1)
    return 0;
    int Index=maxIndex(nums,numsSize);
    int sum=0;
    for(int i=0;i<numsSize;i++)
    {
        sum+=nums[i];
    }
    while(nums[Index]>0)
    {
        if((numsSize*nums[Index]-sum)%(numsSize-1)==0)
        {
            break;
        }
        else
        {
            nums[Index]++;
        }
    }
    return (numsSize*nums[Index]-sum)/(numsSize-1);
}

tips: nums数组里的字[1,1,2147483647] 会出错。  (numsSize*nums[Index]-sum)/(numsSize-1) 对公式需要化简,因为数太大,超过int范围。


WA:

int maxIndex(int* nums,int numsSize)
{
    int max=0;
    for(int i=1;i<numsSize;i++)
    {
        if(nums[i]>nums[max])
        {
            max=i;
        }
    }
    return max;
}
int minMoves(int* nums, int numsSize) {
    if(numsSize==1)
    return 0;
    int Index=maxIndex(nums,numsSize);
    int sum=0;
    for(int i=0;i<numsSize;i++)
    {
        sum+=nums[i];
    }
    while(nums[Index]>0)
    {
        if((nums[Index]-sum)%(numsSize-1)==0)
        {
            break;
        }
        else
        {
            nums[Index]++;
        }
    }
    return (nums[Index]-sum)/(numsSize-1)+nums[Index];
}

tips: 上式改进后,又WA,要哭了。。。。【-100,0,100】错了。。。

AC:

int maxIndex(int* nums,int numsSize)
{
    int max=0;
    for(int i=1;i<numsSize;i++)
    {
        if(nums[i]>nums[max])
        {
            max=i;
        }
    }
    return max;
}
int min1(int* nums,int numsSize)
{
    int min=nums[0];
    for(int i=1;i<numsSize;i++)
    {
        if(min>nums[i])
        {
            min=nums[i];
        }
    }
    return min;
}
int minMoves(int* nums, int numsSize) {
    if(numsSize==1)
    return 0;
    int minVal=min1(nums,numsSize);
    for(int i=0;i<numsSize;i++)
    {
        nums[i]-=minVal;
    }
    int Index=maxIndex(nums,numsSize);
    int sum=0;
    for(int i=0;i<numsSize;i++)
    {
        sum+=nums[i];
    }
    nums[Index]=sum;
    while(nums[Index]>0)
    {
        if((nums[Index]-sum)%(numsSize-1)==0)
        {
            break;
        }
        else
        {
            nums[Index]++;
        }
    }
    return (nums[Index]-sum)/(numsSize-1)+nums[Index];
}

tips::感天动地终于过了!!!加了一个格式化数组函数,将数组里的元素全部减去最小值,然后nums[Index]的范围不在是最大值到无穷,而是数组元素和到无穷(避免了最小元素减去sum时出现负数的情况)。


0 0
原创粉丝点击