面试题3:数组中重复的数字

这篇博客探讨了LeetCode面试题3的三种解决方案,包括使用计数数组、排序以及原地替换策略。第一种方法通过创建数组统计每个元素出现的次数,第二种尝试快速排序后比较相邻元素,第三种利用元素与其索引的关系进行原地操作。这些算法旨在在O(n)的时间复杂度内找出数组中重复的数字。
摘要由CSDN通过智能技术生成

leetcode面试题3

思路1:创建一个数组,将原数组元素当做下标统计次数

int findRepeatNumber(int* nums, int numsSize){
    int nums_harsh[numsSize];
    /*init nums_harsh*/
    for(int i = 0;i < numsSize;i++)
    {
        nums_harsh[i] = 0;
    }
    /*count times*/
    for(int i = 0;i < numsSize;i++)
    {
        nums_harsh[nums[i]]++;
        /*find*/
        if(nums_harsh[nums[i]] == 2)
        {
            return nums[i];
        }
    }
    /*no such element*/
    return -1;
}

思路2:排序,邻居比较
LeetCode上,这个算法无法通过,主要时间复杂度太高
只允许O(n)

/*快排*/
void quickSort(int* nums,int start,int end);
int findRepeatNumber(int* nums, int numsSize){
    quickSort(nums,0,numsSize-1);
    for(int i = 0;i < numsSize;i++)
    {
        if(nums[i] == nums[i+1])
        {
            return nums[i];
        }
    }
    return -1;
}
void quickSort(int* nums,int start,int end)
{
    if(start >= end)
        return;
    int pivot = nums[start];//枢轴
    int left = start;
    int right = end;
    while(left < right)
    {
        while(pivot <= nums[right] && left < right)
        {
            right--;
        }
        nums[left] = nums[right];

        while(pivot >= nums[left] && left < right)
        {
            left++;
        }
        nums[right] = nums[left];
    }
    nums[left] = pivot;
    quickSort(nums,start,left-1);
    quickSort(nums,left+1,end);
}

思路3:对应更换,书中给定的思路
1.将tem元素归位nums[tem]
2.已归位的元素不会被打扰
3.n个元素至多归位n次

int findRepeatNumber(int* nums, int numsSize){
    for(int i = 0;i < numsSize;i++)
    {
        while(nums[i] != i)
        {
            if(nums[i] == nums[nums[i]])
                return nums[i];
            else
            {
                /*交换*/
                int tem;
                tem = nums[i];
                nums[i] = nums[nums[i]];
                nums[tem] = tem;
            }
        }
    }
    return -1;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值