题目:
找出数组中重复的数字。
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。示例 1:
输入:
[2, 3, 1, 0, 2, 5, 3]
输出:2 或 3
限制:
2 <= n <= 100000
这道题目比较简单,直接附上我的两种解法:
我的思路:计数,如果得到的数字次数>1则返回这个数字。
class Solution {
public int findRepeatNumber(int[] nums) {
//数组解法
int[] count = new int[nums.length];
for(int num : nums){
if(count[num] != 0){
return num;
}else{
count[num] = 1;
}
}
return 0;
}
}
class Solution {
public int findRepeatNumber(int[] nums) {
//HashMap解法
Map<Integer, Integer> map = new HashMap<>();
for(int num : nums){
if(map.containsKey(num)){
return num;
}else{
map.put(num, 1);
}
}
return 0;
}
}
HashMap用时更长,这里数组更好。
- 大佬的解法:
import java.util.Arrays;
public class Solution {
public int findRepeatNumber(int[] nums) {
int len = nums.length;
for (int i = 0; i < len; i++) {
// 如果当前的数 nums[i] 没有在下标为 i 的位置上,就把它交换到下标 i 上
// 交换过来的数还得做相同的操作,因此这里使用 while
// 可以在此处将数组输出打印,观察程序运行流程
// System.out.println(Arrays.toString(nums));
while (nums[i] != i) {
if (nums[i] == nums[nums[i]]) {
// 如果下标为 nums[i] 的数值 nums[nums[i]] 它们二者相等
// 正好找到了重复的元素,将它返回
return nums[i];
}
swap(nums, i, nums[i]);
}
}
throw new IllegalArgumentException("数组中不存在重复数字!");
}
private void swap(int[] nums, int index1, int index2) {
int temp = nums[index1];
nums[index1] = nums[index2];
nums[index2] = temp;
}
}
作者:liweiwei1419
链接:https://leetcode-cn.com/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof/solution/tong-de-si-xiang-by-liweiwei1419/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
大佬的代码空间复杂度O(1)很强,也理解了,但是我觉得我很难想到。多看!!!!!!!!多学习!!
但是如果要求不能修改输入值,那么这种解法不合适。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。