不修改數組找出重複的數字(c語言)

不修改數組找出重複的數字(c語言)讓人瑟瑟發抖的面試題


面試

不修改數組找出重複的數字(c語言)來咱們看一下題目
在一個 長度爲n+1的數組裏的全部數字都在1~n的範圍內,因此數組中至少有一個數字是重複的。請找出數組中任意一個重複的數字,但不能修改輸入的數組。
注意:時間複雜度O(n),空間複雜度O(1)數組

不修改數組找出重複的數字(c語言)找出數組中重複的數字(c語言)怎麼解決勒???
分析:利用題目中元素處於1~n的範圍,把元素分爲兩組,判斷兩組元素個數,若是大於範圍,則重複的數字就在這個範圍內。例如:1~3範圍中有4個數,說明其中至少有一個重複的數字。按此二分下去,將會剩下一個數字有兩個,最後輸出。
不修改數組找出重複的數字(c語言)來看看代碼ide

#include<stdio.h>
#define SIZE(arr) sizeof(arr)/sizeof(arr[0])//數組長度

int count_r(const int *arr,int start, int end,int len)//元素範圍內元素的個數
{
    int count = 0;
    int i = 0;
    for (; i < len; i++)
    {
        if (arr[i] >= start&&arr[i] <= end)
        {
            count++;
        }
    }
    return count;
}
int duplicate1(const int *arr, int len)
{
    if (len < 0)
    {
        return 0;
    }
    int start = 1, end = len - 1;
    int count = 0;
    while (end >= start)
    {
        int mid = ((end - start) >> 1) + start;//元素中值
        count = count_r(arr,start, mid,len);//元素二分後,其中一組元素範圍的個數
        if (count>(mid - start + 1))//肯定元素範圍
        {
            end = mid;
        }
        else
        {
            start = mid+1;
        }
        if (end == start)//肯定元素定位到一個元素
        {
            if (count > 1)
                return start;
            else
                break;
        }
    }
    return 0;
}
int main()
{
    int arr[] = { 2, 3, 5,4,3,2,6,7 };
    printf("%d", duplicate1(arr, SIZE(arr)));
    return 0;
}

不修改數組找出重複的數字(c語言)總結:在不修改數組的狀況下,只要知道數組元素範圍,就能夠經過二分元素的方法,找到重複的數字3d

相關文章
相關標籤/搜索