第一天| 704. 二分查找闷游、27. 移除元素、35.搜索插入位置贴汪、34. 在排序數(shù)組中查找元素的第一個和最后一個位置

博客內(nèi)容:

● 今日學(xué)習(xí)的文章鏈接脐往,或者視頻鏈接
● 自己看到題目的第一想法
● 看完代碼隨想錄之后的想法
● 自己實現(xiàn)過程中遇到哪些困難
● 今日收獲,記錄一下自己的學(xué)習(xí)時長

704. 二分查找

v1

class Solution:
    def search(self, nums: List[int], target: int) -> int:
        n = len(nums) 
        left, right = 0, n - 1 
        while left <= right:
            mid = (left + right) // 2 
            if nums[mid] < target:
                left = mid + 1 
            elif nums[mid] > target:
                right = mid - 1 
            else:
                return mid 
        return -1

看完代碼隨想錄之后的想法

主要就是對區(qū)間的定義沒有理解清楚扳埂,在循環(huán)中沒有始終堅持根據(jù)查找區(qū)間的定義來做邊界處理业簿。
區(qū)間的定義就是不變量,那么在循環(huán)中堅持根據(jù)查找區(qū)間的定義來做邊界處理阳懂,就是循環(huán)不變量規(guī)則辖源。
根據(jù)兩種常見的區(qū)間定義,給出了兩種二分法的寫法希太,每一個邊界為什么這么處理克饶,都根據(jù)區(qū)間的定義做了詳細(xì)介紹。

兩個版本寫法
(版本一)左閉右閉區(qū)間

class Solution {
    public int search(int[] nums, int target) {
        // 避免當(dāng) target 小于nums[0] nums[nums.length - 1]時多次循環(huán)運算
        if (target < nums[0] || target > nums[nums.length - 1]) {
            return -1;
        }
        int left = 0, right = nums.length - 1;
        while (left <= right) {
            int mid = left + ((right - left) >> 1);
            if (nums[mid] == target)
                return mid;
            else if (nums[mid] < target)
                left = mid + 1;
            else if (nums[mid] > target)
                right = mid - 1;
        }
        return -1;
    }
}

(版本二)左閉右開區(qū)間

class Solution {
    public int search(int[] nums, int target) {
        int left = 0, right = nums.length;
        while (left < right) {
            int mid = left + ((right - left) >> 1);
            if (nums[mid] == target)
                return mid;
            else if (nums[mid] < target)
                left = mid + 1;
            else if (nums[mid] > target)
                right = mid;
        }
        return -1;
    }
}

相關(guān)題目推薦

27. 移除元素

v1

class Solution:
    def removeElement(self, nums: List[int], val: int) -> int:
        i, j = -1, 0 
        while j < len(nums) and i <= j:
            if nums[j] == val:
                while nums[j] == val:
                    j += 1 
                    if j >= len(nums):
                        break
                if j >= len(nums): 
                    break 
                i += 1
                nums[i] = nums[j] 
                j += 1 
            else:
                i += 1 
                nums[i] = nums[j]
                j += 1 
        return i + 1

看完代碼隨想錄之后的想法

解法1 快慢指針(保持相對順序不變)
// 時間復(fù)雜度:O(n)
// 空間復(fù)雜度:O(1)
class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int slowIndex = 0;
        for (int fastIndex = 0; fastIndex < nums.size(); fastIndex++) {
            if (val != nums[fastIndex]) {
                nums[slowIndex++] = nums[fastIndex];
            }
        }
        return slowIndex;
    }
};  
解法2相向雙指針(基于元素順序可以改變的題目描述改變了元素相對位置誊辉,確保了移動最少元素)
/**
* 時間復(fù)雜度:O(n)
* 空間復(fù)雜度:O(1)
*/
class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int leftIndex = 0;
        int rightIndex = nums.size() - 1;
        while (leftIndex <= rightIndex) {
            // 找左邊等于val的元素
            while (leftIndex <= rightIndex && nums[leftIndex] != val){
                ++leftIndex;
            }
            // 找右邊不等于val的元素
            while (leftIndex <= rightIndex && nums[rightIndex] == val) {
                -- rightIndex;
            }
            // 將右邊不等于val的元素覆蓋左邊等于val的元素
            if (leftIndex < rightIndex) {
                nums[leftIndex++] = nums[rightIndex--];
            }
        }
        return leftIndex;   // leftIndex一定指向了最終數(shù)組末尾的下一個元素
    }
};

相關(guān)題目推薦

  • 26.刪除排序數(shù)組中的重復(fù)項
  • 283.移動零
  • 844.比較含退格的字符串
  • 977.有序數(shù)組的平方
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末矾湃,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子堕澄,更是在濱河造成了極大的恐慌邀跃,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蛙紫,死亡現(xiàn)場離奇詭異拍屑,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)坑傅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門僵驰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人唁毒,你說我怎么就攤上這事蒜茴。” “怎么了浆西?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵粉私,是天一觀的道長。 經(jīng)常有香客問我近零,道長诺核,這世上最難降的妖魔是什么抄肖? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮窖杀,結(jié)果婚禮上憎瘸,老公的妹妹穿的比我還像新娘。我一直安慰自己陈瘦,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布潮售。 她就那樣靜靜地躺著痊项,像睡著了一般。 火紅的嫁衣襯著肌膚如雪酥诽。 梳的紋絲不亂的頭發(fā)上鞍泉,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機(jī)與錄音肮帐,去河邊找鬼咖驮。 笑死,一個胖子當(dāng)著我的面吹牛训枢,可吹牛的內(nèi)容都是我干的托修。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼恒界,長吁一口氣:“原來是場噩夢啊……” “哼睦刃!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起十酣,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤涩拙,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后耸采,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體兴泥,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年虾宇,在試婚紗的時候發(fā)現(xiàn)自己被綠了搓彻。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡嘱朽,死狀恐怖好唯,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情燥翅,我是刑警寧澤骑篙,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站森书,受9級特大地震影響靶端,放射性物質(zhì)發(fā)生泄漏谎势。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一杨名、第九天 我趴在偏房一處隱蔽的房頂上張望脏榆。 院中可真熱鬧,春花似錦台谍、人聲如沸须喂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽坞生。三九已至,卻和暖如春掷伙,著一層夾襖步出監(jiān)牢的瞬間是己,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工任柜, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留卒废,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓宙地,卻偏偏與公主長得像摔认,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子宅粥,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容