七周打卡剑指Offer《找出数组中重复的数》
Posted JunMain
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了七周打卡剑指Offer《找出数组中重复的数》相关的知识,希望对你有一定的参考价值。
1.找出数组中重复的数字
给定一个长度为 n 的整数数组 nums,数组中所有的数字都在 0∼n−1 的范围内。
数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。
请找出数组中任意一个重复的数字。
注意:如果某些数字不在 0∼n−1 的范围内,或数组中不包含重复数字,则返回 -1;
样例
给定 nums = [2, 3, 5, 4, 3, 2, 6, 7]。
返回 2 或 3。
时间复杂度O(N) 空间复杂度O(1)
由于每个数如果合法都在0~n-1
那么我们把每个数都放到它的值对应的下标之处的 变成nums[x] = x;
例如
nums[7] = 5; nums[5] = 8;
让nums[nums[7]] = nums[7];
nums[7] = nums[5] = 8 让两个值交换
如果有重复的
nums[nums[i]] == nums[i] && nums[i] != i
说明之前已经有该数字放到相应的位置了 该数字就是重复的数字
class Solution {
public int duplicateInArray(int[] nums) {
int n = nums.length;
for (int i = 0; i < n; i ++){
if (nums[i] < 0 || nums[i] >= n) return -1;
}
for (int i = 0; i < n; i++){
while (nums[i] != i){
if (nums[i] == nums[nums[i]]) return nums[i];
else{
int t = nums[nums[i]];
nums[nums[i]] = nums[i];
nums[i] = t;
}
}
}
return -1;
}
}
时间复杂度O(N) 空间复杂度O(N)
开一个数组记录 出现的次数
只要次数大于1 就是答案
判断边界
class Solution {
public int duplicateInArray(int[] nums) {
int n = nums.length;
int res = -1;
if(n == 0) return -1;
int[] all = new int[n];
for (int i = 0; i < n; i++){
if(nums[i] < 0 || nums[i] >= n) return -1;
all[nums[i]]++;
if (all[nums[i]] > 1) res = nums[i];
}
return res;
}
}
以上是关于七周打卡剑指Offer《找出数组中重复的数》的主要内容,如果未能解决你的问题,请参考以下文章