原题链接:剑指Offer03:数组中重复的数字
时间复杂度 O(N)
: 遍历数组使用 O(N) ,每轮遍历的判断和交换操作使用 O(1)。
空间复杂度 O(1)
: 使用常数复杂度的额外空间。
Golang
package main
import "fmt"
func findRepeatNumber(nums []int) int {
i := 0
for i < len(nums) {
if nums[i] == i {
i++
continue
}
if nums[nums[i]] == nums[i] {
return nums[i]
}
nums[nums[i]], nums[i] = nums[i], nums[nums[i]]
}
return -1
}
func main() {
input := [...]int{1, 2, 3, 4, 5, 2}
res := findRepeatNumber(input[:])
fmt.Println(res)
}
Python
from typing import List
class Solution:
@staticmethod
def findRepeatNumber(nums: List[int]) -> int:
if not nums: return -1
i = 0
while i < len(nums):
if nums[i] == i:
i += 1
continue
if nums[nums[i]] == nums[i]: return nums[i]
nums[nums[i]], nums[i] = nums[i], nums[nums[i]]
return -1
if __name__ == "__main__":
nums: List[int] = [2, 3, 1, 0, 2, 5, 3]
solution: Solution = Solution()
print(solution.findRepeatNumber(nums=nums))
C#
public class Solution
{
public int FindRepeatNumber(int[] nums)
{
if (nums.Length == 0) return -1;
int i = 0;
while(i < nums.Length) {
if(nums[i] == i) {
i++;
continue;
}
if (nums[nums[i]] == nums[i]) return nums[i];
int tmp = nums[nums[i]];
nums[nums[i]] = nums[i];
nums[i] = tmp;
}
return -1;
}
}
class Program
{
static void Main(string[] args)
{
int[] nums = { 2, 3, 1, 0, 2, 5, 3 };
Solution solution = new Solution();
Console.WriteLine(solution.FindRepeatNumber(nums));
}
}