力扣刷题——数组的改变和移动

难度中等477 给你一个长度为 n 的整数数组,每次操作将会使 n - 1 个元素增加 1 。返回让数组所有元素相等的最小操作次数。 示例 1: 输入:nums = [1,2,3] 输出:3 解释: 只需要3次操作(注意每次操作会增加两个元素的值): [1,2,3] => [2,3,3] => [3,4,3] => [4,4,4] 示例 2: 输入:nums = [1,1,1] 输出:0 要求: 1、每次操作将会使 n - 1 个元素增加 1 2、返回让数组所有元素相等的最小操作次数。 思路: 1、看相对变化,相当于每次只有一个元素相对于其他n-1个元素减了1 2、最后要求数组元素相等 3、只要计算(所有元素与最小元素的差)的和 class Solution { public int minMoves(int[] nums) { Arrays.sort(nums); int sum=0; for(int i=1;i<nums.length;i++){ int temp=0; temp=nums[i]-nums[0]; sum+=temp; } return sum; } }
给你一个长度为 n 的整数数组 nums ,请你判断在 最多 改变 1 个元素的情况下,该数组能否变成一个非递减数列。 我们是这样定义一个非递减数列的: 对于数组中任意的 i (0 <= i <= n-2),总满足 nums[i] <= nums[i + 1]。 示例 1: 输入: nums = [4,2,3] 输出: true 解释: 你可以通过把第一个 4 变成 1 来使得它成为一个非递减数列。 示例 2: 输入: nums = [4,2,1] 输出: false 解释: 你不能在只改变一个元素的情况下将其变为非递减数列。 思路:贪心算法 在改变一个元素的时候要保证对后一个元素无影响(瞻前顾后) class Solution { public boolean checkPossibility(int[] nums) { int temp=0; for(int i=0;i<nums.length-1;i++){ if(nums[i]>nums[i+1]){ temp++; if(temp>1){ return false; }else if(i>0&& nums[i+1] < nums[i - 1]){ nums[i+1]=nums[i]; } } } if(temp>1){ return false; }else{ return true; } } }
难度简单1742 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums = [0,1,0,3,12] 输出: [1,3,12,0,0] 示例 2: 输入: nums = [0] 输出: [0] 思路:滚雪球 class Solution { public void moveZeroes(int[] nums) { int cnt=0; for(int i=0;i<nums.length;i++){ if(nums[i]==0){ cnt++; }else{ int temp=nums[i]; nums[i]=0; nums[i-cnt]=temp; } } } }
经验分享 程序员 微信小程序 职场和发展