标签:return 数字 nums 重复 Offer03 int 数组
找出数组中重复的数字。
题目描述
- 在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
- 示例 1:
输入:
[2, 3, 1, 0, 2, 5, 3]
输出:2 或 3 - 限制:2 <= n <= 100000
第一种解法
- 先把输入的数组排序,之后从排序的数组种找出重复的数字
- 时间复杂度 O(nlogn) 空间复杂度O(1)
public int findRepeatNumber(int[] nums) {
Arrays.sort(nums);
for(int i = 0 ; i < nums.length-1 ;i++){
if(nums[i]==nums[i+1]) return nums[i];
}
return -1;
}
第二种解法
- 使用排序的方法的话,会改变原本的数组中数字顺序,还可以使用哈希表的方法,扫描到每个数字都可以将其在哈希表中进行搜索是否有相同的数字,如果有则返回这个数字,否则将数字加入到哈希表中
- 时间复杂度O(n) 空间复杂度O(n)
public int findRepeatNumber(int[] nums) {
int n = nums.length;
//这里使用一个数组模拟一个哈希表
//查询速度较快
int[] arr = new int[n+1];
for (int i = 0; i < n; i++) {
if(arr[nums[i]+1]!=0){
return nums[i];
}else {
arr[nums[i]+1]++;
}
}
return -1;
}
第三种解法
- 输入的数字都在0~n-1 之间。如果这个数组中没有重复的数字,那么当数组排序之后的数字i将出现在小标为i的位置,由于数组中有重复的数字,有些位置可能存在多个数字,同时可能有些位置没有数字
- 重排这个数组。从头到尾依次扫描这个数组中的每个数字。当扫描到下标为i的数字时,首先比较这个数字(用m表示)是不是等于i。如果是,则接着扫描下一个数字;如果不是,则再拿它和第m个数字进行比较。如果它和第m个数字相等,就找到了一个重复的数字(该数字在下标为i和m的位置都出现了);如果它和第m个数字不相等,就把第i个数字和第m个数字交换,把m放到属于它的位置。接下来再重复这个比较、交换的过程,直到发现一个重复的数字。
public static int findRepeatNumber(int[] nums) {
int i;
for (i = 0; i < nums.length; i++) {
while(nums[i] != i) {
if(nums[i] == nums[nums[i]]) {
return nums[i];
}
int temp = nums[i];
nums[i] = nums[temp];
nums[temp] = temp;
}
}
return -1;
}
标签:return,数字,nums,重复,Offer03,int,数组 来源: https://blog.csdn.net/qq_43650490/article/details/119392059
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。