Leetcode - Find the Duplicate Number

My code:

public class Solution {
    public int findDuplicate(int[] nums) {
        if (nums == null || nums.length == 0)
            return -1;
        int begin = 1;
        int end = nums.length;
        while (begin < end) {
            int mid = begin + (end - begin) / 2;
            int counter = 0;
            for (int i = 0; i < nums.length; i++)
                if (nums[i] <= mid)
                    counter++;
            if (counter > mid)
                end = mid;
            else
                begin = mid + 1;
        }
        return begin;
    }
}

這道題目我沒能想出來。感覺有點考智商。那個想法我的確沒想出來。
首先貼一個博文。
http://bookshadow.com/weblog/2015/09/28/leetcode-find-duplicate-number/

然后這道題目有O(n) 的做法。但是感覺思路太復(fù)雜了。就忽略了。
然后思考了下他的第二種做法, O(n log n)
舉個例子:
假設(shè)n = 9
那么,有10個位置放入1-9
肯定會有重復(fù)。
取中間值 1 + (10 - 1) / 2 = 5;
在1-9中, <= 5 的應(yīng)該有5個,假設(shè)不重復(fù)。
但是如果1-5之間有數(shù)字重復(fù)了,那么,就應(yīng)該大于5個了。
所以,遍歷下整個數(shù)組,統(tǒng)計 <=5 的個數(shù),如果大于5,那么就表示,
那個重復(fù)的數(shù)字,他的值v , 1 <= v <= 5
也就是
begin <= v <= mid
反之,則是:
mid + 1 <= v <= end
于是采用binary search 的思想,一步步往下縮小范圍。最終,就能把v限定在一個確定值里面,此時,
begin = end
所以,最終可以找到這個值。

**
總結(jié): 不在是binary search array, 而是 通過 binary search 來限定一個可能性取值的范圍。最終達到目的。
**

Anyway, Good luck, Richardo!

My cdoe:

public class Solution {
    public int findDuplicate(int[] nums) {
        if (nums == null || nums.length == 0)
            return -1;
        int begin = 1;
        int end = nums.length -1; // end = n
        while (begin < end) {
            int target = (begin + end) / 2;
            int count = 0;
            for (int i = 0; i < nums.length; i++) {
                if (nums[i] >= begin && nums[i] <= target)
                    count++;
            }
            if (count > target - begin + 1) {
                end = target;
            }
            else {
                begin = target + 1;
            }
        }
        return begin;
    }
}

寒假在家效率實在太低。這道題目再做也還是沒有做出來。shit
思路還是聽巧妙地。
Anyway, Good luck, Richardo!

My code:

public class Solution {
    public int findDuplicate(int[] nums) {
        if (nums == null || nums.length == 0) {
            return -1;
        }
        
        int i = 0;
        while (i < nums.length) {
            if (nums[nums[i] - 1] != nums[i]) {
                int temp = nums[nums[i] - 1];
                nums[nums[i] - 1] = nums[i];
                nums[i] = temp;
            }
            else if (nums[i] - 1 == i) {
                i++;
                continue;
            }
            else {
                return nums[i];
            }
        }
        
        return -1;
    }
}

這道題目的思想和
http://www.itdecent.cn/p/fc874688359e
差不多。

然后看了下以前的做法,也是真的巧妙啊。感覺復(fù)雜度也是O(n)啊 ?

Anyway, Good luck, Richardo! -- 09/01/2016

最新的做法不太對。因為我修改了原數(shù)組。這是不允許的。
所以一開始的做法才是正確的。

Anyway, Good luck, Richardo! -- 09/11/2016

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容