Re: [閒聊] 每日LeetCode

作者: Rushia (みけねこ的鼻屎)   2023-02-21 11:56:42
540. Single Element in a Sorted Array
給你一個已排序整數陣列,裡面的所有數字都有恰好兩個,只有一個數字只有一個,
找出這個數字是什麼,限制時間複雜度:O(logn)且空間複雜度:O(1)。
Example :
Input: nums = [1,1,2,3,3,4,4,8,8]
Output: 2
Input: nums = [3,3,7,7,10,11,11]
Output: 10
思路:
1.看到題目說"陣列已排序"和"時間複雜度O(logn)"就可以確定這題要用二元搜尋來
做了,問題是我們要怎麼樣才能每次查找都捨棄掉一半不必去查的資料。
2.首先做個邊界處理,n == 1 的時候直接返回。
3.把mid作為切點,檢查當前mid這個索引數字的左右兩邊,如果有重複數字就返回兩
個重複數字的索引,否則直接返回nums[mid]。
4.要判斷要往左邊找還是右邊找的條件是:判斷某一半邊的元素數量是否是偶數
舉例來說,若index=[3,4]
1 1 2 3 3 4 4
因為所有數字恰好兩個且只有一個數字只有一個,所以一定有一邊有奇數個元素
所以去除當前重複元素之後的半邊如果有奇數個元素就往那邊找,另一邊捨棄。
5.最後返回nums[l]即可
JavaCode:
作者: DDFox (冒險者兼清潔工)   2023-02-21 11:58:00
大師
作者: Che31128 (justjoke)   2023-02-21 11:59:00
大師
作者: abcd991276 (QQ)   2023-02-21 12:03:00
大師
作者: NTHUlagka (拉卡)   2023-02-21 12:23:00
大師 想問一下為什麼長度=1時直接回傳0阿 而不是nums[0]是說你那個判斷不加應該也沒差 底下的二分搜還是能找到答案XD想說原來長度1的測資答案剛好是0阿喔喔說錯沒跑二分直接回傳nums[l]就是
作者: idiont (supertroller)   2023-02-21 12:50:00
沒有那個判斷 底下檢查會超出邊界 應該是必要的沒事 原來有檢查 那應該沒差
作者: NTHUlagka (拉卡)   2023-02-21 12:51:00
不會吧 沒那個判斷就不會進入二分搜尋了 因為l==r可能也不需要檢查雙向 我是只有判斷單向 你另一邊會在之後被檢查到
作者: Rushia (みけねこ的鼻屎)   2023-02-21 13:17:00
對不起 我二元搜尋超爛
作者: NTHUlagka (拉卡)   2023-02-21 13:42:00
沒 樓主大師
作者: dustsstar79 (穆)   2023-02-21 14:03:00
大師

Links booklink

Contact Us: admin [ a t ] ucptt.com