剑指 Offer 03. 数组中重复的数字
剑指 Offer 03. 数组中重复的数字
对于此题,可以有几种不同的考虑,如果可以看出这是一类频率统计题,容易联系到哈希表,所以第一种方法也是比较容易想到的办法就是用哈希表来统计词频,这里由于数据范围可确定(0-n-1
),可以用数组来简化一些代码上的书写,这种方法时间复杂度为,空间复杂度为。
class Solution {
public int findRepeatNumber(int[] nums) {
int n = nums.length;
if (n == 0) {
return 0;
}
int[] map = new int[n];
for(int num : nums) {
map[num]++;
if(map[num] > 1) return num;
}
return 0;
}
}
以上是基于词频的角度考虑,再考虑不需要新空间的算法,若我们将数组排序,如果有重复的数字,那么它们将会在相邻位置,同样可以做到找出重复数字的目的。时间复杂度,空间复杂度。
class Solution {
public int findRepeatNumber(int[] nums) {
Arrays.sort(nums);
for (int i = 1; i < nums.length; i++) {
if (nums[i] == nums[i - 1])
return nums[i];
}
return -1;
}
}
再考虑空间复杂度为且时间复杂度能够更低的算法。
我们可以发现给定的数据范围为。若我们将对应的索引放置在它的对应位置,如果没有重复元素,那么每个元素都会被放在它的索引位置,如果有重复元素,则放置时会发现该位置已经有元素了。
class Solution {
public int findRepeatNumber(int[] nums) {
int n = nums.length;
for(int i = 0; i < n; i++) {
while(nums[i] != i) {
if(nums[nums[i]] == nums[i]) return nums[i];
int tmp = nums[i];
nums[i] = nums[tmp];
nums[tmp] = tmp;
}
}
return -1;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!