• LeetCode 453. 最小移动次数使数组元素相等


    题目描述:

    解法一(暴力法):

    class Solution {
    public:
        int minMoves(vector<int>& nums) {
            int res=0;
            int mmax=0,mmin=0;
            while(1){
                for(int i=0;i<nums.size();i++){
                    if(nums[i]>nums[mmax])
                        mmax=i;
                    if(nums[i]<nums[mmin])
                        mmin=i;
                }
                if(nums[mmin]==nums[mmax])
                    break;
                for(int i=0;i<nums.size();i++){
                    if(i!=mmax)
                        nums[i]++;
                }
                res++;
            }
            return res;
        }
    };

    解法二(改进暴力法):

    class Solution {
    public:
        int minMoves(vector<int>& nums) {
            int res = 0;
            int mmax = 0, mmin = 0;
            while (1) {
                for (int i = 0; i<nums.size(); i++) {
                    if (nums[i]>nums[mmax])
                        mmax = i;
                    if (nums[i]<nums[mmin])
                        mmin = i;
                }
                if (nums[mmin] == nums[mmax])
                    break;
                int dis = nums[mmax] - nums[mmin];
                for (int i = 0; i<nums.size(); i++) {
                    if (i != mmax)
                        nums[i] += dis;
                }
                res += dis;
            }
            return res;
        }
    };

    解法三:

    class Solution {
    public:
        int minMoves(vector<int>& nums) {
            int res=0;
            sort(nums.begin(),nums.end());
            for(int i=1;i<nums.size();i++){
                res+=nums[i]-nums[0];
            }
            return res;
        }
    };
    
    class Solution {
    public:
        int minMoves(vector<int>& nums) {
            int res=0,min=0;
            for(int i=1;i<nums.size();i++){
                if(nums[i]<nums[min])
                    min=i;
            }
            for(int i=0;i<nums.size();i++){
                res+=nums[i]-nums[min];
            }
            return res;
        }
    };

    解法四(动态规划):

    class Solution {
    public:
        int minMoves(vector<int>& nums) {
            int moves=0;
            sort(nums.begin(),nums.end());
            for(int i=1;i<nums.size();i++){
                int diff=nums[i]+moves-nums[i-1];
                nums[i]+=moves;
                moves+=diff;
            }
            return moves;
        }
    };
    
    
    class Solution {
    public:
        int minMoves(vector<int>& nums) {
            int moves=0;
            sort(nums.begin(),nums.end());
            for(int i=1;i<nums.size();i++){
                nums[i]+=moves;
                int diff=nums[i]-nums[i-1];
                moves+=diff;
            }
            return moves;
        }
    };

    参考:https://leetcode-cn.com/problems/minimum-moves-to-equal-array-elements/solution/zui-xiao-yi-dong-ci-shu-shi-shu-zu-yuan-su-xiang-d/

  • 相关阅读:
    gcc数据对齐之: howto 2.
    gcc数据对齐之: howto 1.
    gcc数据结构对齐之:why.
    linux tricks 之 BUILD_BUG_ON_ZERO.
    linux tricks 之 FIELD_SIZEOF.
    linux tricks 之 container_of.
    linux tricks 之 bitmap分析.
    linux tricks 之 roundup.
    Windows之svn问题
    Embeded linux之地址映射
  • 原文地址:https://www.cnblogs.com/oneDongHua/p/14264003.html
Copyright © 2020-2023  润新知