1、(453)最小操作次数使数组元素相等
给定一个长度为 n 的 非空 整数数组,每次操作将会使 n - 1 个元素增加 1。找出让数组所有元素相等的最小操作次数。
在只考虑元素相对大小的情况下,每次将除该元素的其他元素加 1 可等价为将该元素减 1。则只需将所有元素减至最小即可。
public int minMoves(int[] nums) {
int max=Integer.MAX_VALUE;
int res=0;
for(int x:nums){
res+=x;
max=Math.min(max,x);
}
return res-max*nums.length;
}
2、(41)缺失的第一个正数
求未排序的非空整数数组中未出现的第一个最小正数。
遍历数组,将符合在给定数组长度内的元素调整至相应位置,之后逐个判断即可。
public int firstMissingPositive(int[] nums) {
int l=nums.length;
for(int i=0;i<l;i++){
while(nums[i]>0&&nums[i]<=l&&nums[i]!=nums[nums[i]-1]){
swap(nums,i,nums[i]-1);
}
}
for(int i=0;i<l;i++)
if(nums[i]!=i+1)return i+1;
return l+1;
}
void swap(int[] nums,int a,int b){
int t=nums[a];
nums[a]=nums[b];
nums[b]=t;
}
3、(238)除自身以外数组的乘积
乘积 = 当前数左边的乘积 * 当前数右边的乘积
public int[] productExceptSelf(int[] nums) {
int[] res = new int[nums.length];
int k = 1;
for(int i = 0; i < res.length; i++){
res[i] = k;
k = k * nums[i]; // 此时数组存储的是除去当前元素左边的元素乘积
}
k = 1;
for(int i = res.length - 1; i >= 0; i--){
res[i] *= k; // k为该数右边的乘积。
k *= nums[i]; // 此时数组等于左边的 * 该数右边的。
}
return res;
}