zoukankan      html  css  js  c++  java
  • [Math_Medium]462. Minimum Moves to Equal Array Elements II

    原题462. Minimum Moves to Equal Array Elements II

    题目大意:

    给你一串数字,对于每个数字,一次性可以移动一步(数值增加1或者减小1),请问如何在最小的步伐数内使所有的数字都相等

    Example

    Input:
    [1,2,3]
    Output:
    2
    Explanation:
    Only two moves are needed (remember each move increments or decrements one element):
    [1,2,3] => [2,2,3] => [2,2,2]

    解题思路:

    1. 错误思路:我的第一想法是求出这一串数字的平均数,再用每一个数减去这个平均数,求和,即输出最短步伐,提交,WA,错误例子为[1,0,0,8,6],这里应设为1,而不是平均数
    2. 正确思路:我们先把这一列数按从小到大的顺序排序,把基准数k从最小数字开始,显然此时不是最优解,如果我们增加k,比k大的数字的步伐都会减1,比k小的数字的步伐都会加1,当k左右的数字一样多的时候,步伐最小。
      k-a[1]+k-a[2]+k-a[3]+...+a[N-3]-k+a[N-2]-k+a[N-1]-k,当+k和-k的数目一样多的时候,k就会被抵消,这样就是后面的数减前面的数,这里要注意是奇数个还是偶数个

    代码1:

    class Solution {
    public:
        int minMoves2(vector<int>& nums) {
            sort(nums.begin(),nums.end());
            int ans=0,mid=0;
            if(nums.size()%2)
                mid=(nums.size()+1)/2;
            else
                mid=nums.size()/2;
            mid-=1;
            for(int i=0;i<mid;i++)
                ans-=(nums[i]);
            for(int i=mid+1;i<nums.size();i++)
                ans+=(nums[i]);
            if(nums.size()%2==0)
                ans-=nums[mid];
            return ans;
        }
    };
    

    改良代码:对于奇数个,中间那个数不用参与运算,即自己减自己为0;对于偶数个,中间那个数视为左边的数,要参与运算;所以可以使用(nums.size()+1)/2,即若size为奇数,上面式子增加1,若为偶数,值不变,(相对于size/2)

    class Solution{
        public:
        int minMoves2(vector<int>& nums)
        {
            sort(nums.begin(),nums.end());
            int mid=nums.size()/2,ans=0;
            for(int i=0;i<mid;i++)
                ans-=nums[i];
            for(int i=(nums.size()+1)/2;i<nums.size();i++)//使用(size()+1)/2,如果size是奇数,那么值会+1,即从下一项开始;如果是偶数,值不变,仍然当前项
                ans+=nums[i];
            return ans;
        }
    };    
    
  • 相关阅读:
    C++的开源跨平台日志库glog学习研究(一)
    C++实现的字符串模糊匹配
    Git&GitHub学习日志
    UTF-8和GBK等中文字符编码格式介绍及相互转换
    HDU
    340. 通信线路(分层图最短路)
    ACwing 你能回答这些问题吗(线段树求最大连续字段和)
    Laptop(线段树+离散化)
    Infinite Inversions(树状数组+离散化)
    HDU-4417-Super Mario(主席树解法)
  • 原文地址:https://www.cnblogs.com/qiulinzhang/p/9514357.html
Copyright © 2011-2022 走看看