【剑指offer】 acwing 13. 找出数组中重复的数字
剑指offer
原题链接
给定一个长度为 n 的整数数组 nums,数组中所有的数字都在 0∼n−1 的范围内。
数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。
请找出数组中任意一个重复的数字。
注意:如果某些数字不在 0∼n−1 的范围内,或数组中不包含重复数字,则返回 -1;
数据范围
0≤n≤1000
样例
给定 nums = [2, 3, 5, 4, 3, 2, 6, 7]。
返回 2 或 3。
题解
我第一想到的是hashset hashmap之类的 不过这样的话空间复杂度就多了
所以介绍一种O(n) 空间复杂度是O(1)的做法
将当前位置的数值放到他的位置上去,比如{2,2,3,3,4},将nums[0]的数应该放到nums[2]上,即将该数组放到他在数组中和他角标相等的位置,每次都检查要交换的位置上的数值是否一样,如果一样,则重复,如果不一样,则交换。
class Solution {
public int duplicateInArray(int[] nums) {
int n = nums.length;
for(int i = 0; i < n ; i++){//如果出界 则返回-1
if(nums[i] < 0 || nums[i] >= n )
return -1 ;
}
// Arrays.sort(nums); 加入sort函数的话 就变成nlogn 而不是n了
for(int i = 0; i < n; i++){
while(nums[i]!=i){
if(nums[i]==nums[nums[i]])// 说明nums[i]出现了多次,直接返回即可;
return nums[i];
int temp = nums[i];
nums[i] = nums[temp];
nums[temp] = temp;
}
}
return -1;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)