力扣题:数组的改变、移动-9.25

力扣题-9.25

[力扣刷题攻略] Re:从零开始的力扣刷题生活

力扣题1:453. 最小移动次数使数组元素相等

解题思想:使得n-1个元素增加1,相当于对1个数进行-1操作,因此只要所有数都进行-1操作一直到与最小的数一样大即可。

力扣题:数组的改变、移动-9.25_第1张图片

class Solution(object):
    def minMoves(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        nums = sorted(nums)
        temp = 0
        for i in nums:
          temp = temp + i 
        return temp-len(nums)*nums[0]
class Solution {
public:
    int minMoves(vector<int>& nums) {
        std::sort(nums.begin(), nums.end());
        int temp = 0;
        for (int num : nums) {
            temp += num;
        }
        return temp-nums.size()*nums[0];
    }
};

力扣题2:665. 非递减数列

解题思想:对数组的修改只有两种,例如[3,4,2,3],判断出4>2之后,第一种修改为[3,2,2,3],第二种修改为[3,4,4,3],对两种修改只要有一种能是非递减数列即可,两种都不符合返回False。

力扣题:数组的改变、移动-9.25_第2张图片

class Solution(object):
    def checkPossibility(self, nums):
        """
        :type nums: List[int]
        :rtype: bool
        """
        flag = 0
        result = 0
        for i in range(1,len(nums)):
            if nums[i-1]>nums[i]:
                flag = flag+1
                temp = nums[i-1]
                nums[i-1] = nums[i]
                for j in range(1,len(nums)):
                    if nums[j-1]>nums[j]:
                        result = 1
                        break
                if result==0:
                    return True
                nums[i] = temp
                nums[i-1] = temp
                result=0
                for j in range(1,len(nums)):
                    if nums[j-1]>nums[j]:
                        return False
                if result==0:
                    return True
        if result==0:
		    return True
		return False
class Solution {
public:
    bool checkPossibility(vector<int>& nums) {
        int flag =0;
        int result=0;
        int temp=0;
        for (int i=1;i<nums.size(); i++) {
            if (nums[i - 1] > nums[i]) {
                flag = flag+1;
                temp = nums[i-1];
                nums[i-1] = nums[i];
                for (int j =1;j<nums.size();j++){
                    if (nums[j-1]>nums[j]){
                        result=1;
                        break;
                    }
                }
                if (result==0){
                    return true;
                }
                nums[i] = temp;
                nums[i-1] = temp;
                result=0;
                for (int j =1;j<nums.size();j++){
                    if (nums[j-1]>nums[j]){
                        return false;
                    }
                }
                if (result==0){
                    return true;
                }
            }
        }
        if (result==0){
            return true;
        }
        return false;
    }
};

力扣题3:283. 移动零

解题思想:将两个下标进行移动,其中i为写入的下标,j为遍历的下标,如果nums[j]为0,则不进行写入,继续遍历;如果nums[j]不是0,则将nums[j]写入到对应下标i的位置;最后将末尾都补成0。

力扣题:数组的改变、移动-9.25_第3张图片

class Solution(object):
    def moveZeroes(self, nums):
        """
        :type nums: List[int]
        :rtype: None Do not return anything, modify nums in-place instead.
        """
        i = 0
        j = 0
        while j<len(nums):
            if nums[j]==0:
                j=j+1
            else:
                nums[i]=nums[j]
                i=i+1
                j=j+1
        while i<len(nums):
            nums[i] = 0
            i=i+1
        return nums
class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        int i = 0;
        int j = 0;
        int length = nums.size();
        while (j<length){
            if (nums[j]==0){
                j=j+1;
            }
            else{
                nums[i]=nums[j];
                i=i+1;
                j=j+1;
            }
        }
        while (i<length){
            nums[i] = 0;
            i=i+1;
        }
    }
};

你可能感兴趣的:(leetcode)