原地置换,手动模拟哈希表

剑指 Offer 03. 数组中重复的数字

法1:HASHSET 

class Solution {public int findRepeatNumber(int[] nums) {Set set=new HashSet<>();for(int num:nums){if(!set.add(num)){return num;}}return -1;}
}

 法2:原地置换(下标与当前值是否相同-- 下标1 当前值1)

如果没有重复数字,那么正常排序后,数字i应该在下标为i的位置,所以思路是重头扫描数组,遇到下标为i的数字如果不是i的话,(假设为m),那么我们就拿与下标m的数字交换。在交换过程中,如果有重复的数字发生,那么终止返回

class Solution {public int findRepeatNumber(int[] nums) {int temp;for(int i=0;i

41. 缺失的第一个正数

class Solution {public int firstMissingPositive(int[] nums) {int len=nums.length;for (int i = 0; i 0 && nums[i]<=len && nums[i]!=nums[nums[i]-1]){int t=nums[i];nums[i]=nums[t-1];nums[t-1]=t;}}for (int j = 0; j 

442. 数组中重复的数据 

因为给定题目  值为 1---n  而下标是从0开始  所以 对应 值减一 

当前数值-1  作为下标  的 值 变为负数

int[] arr=new int[]{3,2,4,11,33};

比如3 修改对应下标为2的位置的数也就是4 变为 -4;

class Solution {public List findDuplicates(int[] nums) {List ans=new ArrayList<>();int len=nums.length;for(int i=0;i

448. 找到所有数组中消失的数字

class Solution {public List findDisappearedNumbers(int[] nums) {List ans=new ArrayList<>();int len=nums.length;//值   1 2 3 4//下标 0 1 2 3for(int i=0;i0)  nums[index]= -nums[index];}for(int i=0;i0) ans.add(i+1);}return ans;}
}

 


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章