题目内容
找出数组中重复的数字。
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
示例 1:
输入:
[2, 3, 1, 0, 2, 5, 3]
输出:2 或 3
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof
java语言解答 哈希表 时间复杂读O(n),但是创建了一个hash数组浪费了O(n)空间
//哈希表实现
class Solution {
public int findRepeatNumber(int[] nums) {
//判断长度
if(nums.length==0||nums==null){
return -1;
}
//定义hash表,用来判断是否有重复元素
int [] hash=new int[nums.length];
for(int i=0;i<nums.length;i++){
//数组分配有空间后系统会默认赋默认值0
// hash[i]=0;
//判断数字是否在0-(长度-1)范围
if(nums[i]<0||nums[i]>=nums.length){
return -1;
}
}
//不在hash表就加入,再了就返回.
for(int i=0;i<nums.length;i++){
if(hash[nums[i]]==1){
return nums[i];
}
hash[nums[i]]=1;
}
return -1;
}
}
c语言解答 哈希表(思路同java)
int findRepeatNumber(int* nums, int numsSize){
if(numsSize==0||nums==NULL)
return -1;
int hash[numsSize];
for(int i=0;i<numsSize;i++){
//系统会自动赋0值,但是还是自己初始化好
hash[i]=0;
if(nums[i]<0||nums[i]>numsSize-1){
return -1;
}
}
for(int i=0;i<numsSize;i++){
if(hash[nums[i]]==1){
return nums[i];
}
hash[nums[i]]=1;
}
return -1;
}
java一次遍历,且不需要额外开辟空间
//时间复杂度O(n),不需要单独辟空间
class Solution {
public int findRepeatNumber(int[] nums) {
//判断长度
if(nums.length==0||nums==null){
return -1;
}
for(int i=0;i<nums.length;i++){
//判断数字是否在0-(长度-1)范围
if(nums[i]<0||nums[i]>=nums.length){
return -1;
}
}
//如果没有重复的时候,排好序,每个索引对应的元素就是索引的值
//可以通过交换,直到索引位置对应的值等于自己的时候再往下遍历,不是的话就看该值对应位置索引是否有和自己一样的,有就说明两者是重复的,没有就把这个值和那个位置交换,然后继续重复上面的步骤..
for(int i=0;i<nums.length;i++){
while(i!=nums[i]){
if(nums[i]==nums[nums[i]]){
return nums[i];
}
int t=nums[nums[i]];
nums[nums[i]]=nums[i];
nums[i]=t;
}
}
return -1;
}
}
c语言解答 一次遍历,不需要另开空间 思路同java
int findRepeatNumber(int* nums, int numsSize){
if(numsSize==0||nums==NULL)
return -1;
for(int i=0;i<numsSize;i++){
if(nums[i]<0||nums[i]>=numsSize){
return -1;
}
}
for(int i=0;i<numsSize;i++){
while(i!=nums[i]){
if(nums[i]==nums[nums[i]]){
return nums[i];
}
int t=nums[i];
nums[i]=nums[nums[i]];
//nums[nums[i]]=t;//错就错在值变了还用,因为nums[i]变了,此时写成nums[t]=t;
nums[t]=t;
}
// while(i!=nums[i]){
// if(nums[i]==nums[nums[i]]){
// return nums[i];
// }
// int t=nums[nums[i]];
// nums[nums[i]]=nums[i];
// nums[i]=t;
// }
}
return -1;
}
总结
其实学一道题可以试试不断优化改进,思考的多一点,这样学到的会多一点.