【LeetCode 0-Start】[数组]数组的改变、移动
前言
数组的改变、移动
题目序号: 453、665、283
一、[简单]453. 最小移动次数使数组元素相等
题目来源
算法思想:数组;
思路:
- n-1个数同时加一,相当于剩下的一个数减一;
- 只能做减法,所以数组最后的数只能是最小值;
- 每个元素减去最小值求,再求其和就是答案。
java代码
class Solution {
public int minMoves(int[] nums) {
int min = Integer.MAX_VALUE;//统计最小值
int sum = 0;//求和
for (int i = 0; i < nums.length; i++) {
if (nums[i] < min) {
min = nums[i];
}
sum += nums[i];
}
return sum - min * nums.length;//总和减去最小值=要降低数的次数
}
}
二、[简单]665. 非递减数列
题目来源
算法思想:数组;
思路:暴力的方法,
java代码
public class Solution {
public boolean checkPossibility(int[] nums) {
if (nums.length == 1) {
return true;
}//如果长度为,直接返回true
for (int i = 0; i < nums.length; i++) {
int temp = nums[i];//先保存原始元素
if (i == 0) {
//再修改
nums[i] = Integer.MIN_VALUE;//第一位修改陈最小值
} else {
nums[i] = nums[i - 1];//其他的修改位前一位
}
if(check(nums)){
//判断,修改成功,直接返回true
return true;
}
nums[i] = temp;//修改不成功,修改回原始值,进行下一轮判断
}
return false;
}
public boolean check(int[] nums) {
//判断数组是否是单调非递减
for (int i = 0; i < nums.length - 1; i++) {
if (nums[i] > nums[i + 1]) {
return false;
}
}
return true;
}
}
三、[简单]283. 移动零
题目来源
算法思想:数组;
思路:
- 利用快排的思想,交换元素,巧妙(两指针)
- 一次遍历,时间复杂度是O(n)
java代码
class Solution {
public void moveZeroes(int[] nums) {
//两个指针i和j
int j = 0;
for(int i = 0;i < nums.length; i++) {
//当前元素!=0,就把其交换到左边,等于0的交换到右边
if(nums[i] != 0) {
if(i > j){
//如果,nums[i]非零,且,i在j之后,说明,j所在位置是0,此时需要进行交换
nums[j] = nums[i];
nums[i] = 0;
}
j++;//如果nums[i]非0,则j++,移动下一个0的位置
}
}
}
}