高频考题!数组中找重复数字(算法 NO.1)
Doocs开源社区
共 393字,需浏览 1分钟
·
2020-08-06 21:33
本题来自 LeetCode 中国网站,属于算法面试中的一道经典高频考题。题解由 Doocs 开源社区 leetcode 项目维护者提供。
目前已经有超过 50 位开发者参与了此项目,期待你的加入!
项目地址:https://github.com/doocs/leetcode
题目描述
找出数组中重复的数字。
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
示例 1:
输入:
[2, 3, 1, 0, 2, 5, 3]
输出:2 或 3
限制:
2 <= n <= 100000
解法
0~n-1 范围内的数,分别还原到对应的位置上,如:数字 2 交换到下标为 2 的位置。
若交换过程中发现重复,则直接返回。
Python3
class Solution:
def findRepeatNumber(self, nums: List[int]) -> int:
for i, num in enumerate(nums):
while i != num:
if num == nums[num]:
return num
nums[i], nums[num] = nums[num], nums[i]
num = nums[i]
return -1
Java
class Solution {
public int findRepeatNumber(int[] nums) {
for (int i = 0, len = nums.length; i < len; ++i) {
while (i != nums[i]) {
if (nums[i] == nums[nums[i]]) {
return nums[i];
}
swap(nums, i, nums[i]);
}
}
return -1;
}
private void swap(int[] nums, int i, int j) {
int t = nums[i];
nums[i] = nums[j];
nums[j] = t;
}
}
长按识别下图二维码,关注公众号「Doocs开源社区」,第一时间跟你们分享好玩、实用的技术文章与业内最新资讯。
评论