原地Hash法
一.缺失的第一个正数
class Solution {
public int firstMissingPositive(int[] nums) {
for(int i=0;i<nums.length;i++){
//当前i位置的值在数组中有他的位置且当前位置不在正确的位置上
//注意这里为什么是nums[nums[i]-1]!=nums[i]而不是nums[i]-1!=i
//我们要防止死循环的出现,举个例子:int []nums = {3,4,1,1};
//变化过程如下:
//1,4,3,1-->1,1,3,4-->此时如果采用nums[i]-1!=i出现死循环,因此
//nums[nums[i]-1]!=nums[i]可以推出nums[i]-1!=i且防止死循环
while ((1<=nums[i]&&nums[i]<=nums.length)&&nums[nums[i]-1]!=nums[i]){
swap(nums,nums[i]-1,i);
}
}
int index = 0;
while(index<nums.length&&nums[index]==index+1){
index++;
}
return index+1;
}
public void swap(int []nums,int i,int j){
int temp = nums[i];
nums[i]= nums[j];
nums[j] = temp;
}
}
二.数组中重复的数据
public class Solution {
public List<Integer> findDuplicates(int[] nums) {
for(int i=0;i<nums.length;i++){
while(nums[nums[i]-1]!=nums[i]){
swap(nums,i,nums[i]-1);
}
}
List<Integer> list = new ArrayList<>();
for(int i=0;i<nums.length;i++){
if(nums[i]!=-1&&nums[i]!=i+1&&nums[nums[i]-1]!=-1){
list.add(nums[i]);
nums[nums[i]-1]=-1;
}
}
return list;
}
void swap(int []nums,int i,int j){
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}
public class Solution {
public List<Integer> findDisappearedNumbers(int[] nums) {
for(int i=0;i<nums.length;i++){
while(nums[nums[i]-1]!=nums[i]){
swap(nums,i,nums[i]-1);
}
}
List<Integer> list = new ArrayList<>();
for(int i=0;i<nums.length;i++){
if(nums[i]!=i+1){
list.add(i+1);
}
}
return list;
}
void swap(int []nums,int i,int j){
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}