今日學習的文章鏈接和視頻鏈接
● 自己看到題目的第一想法
● 看完代碼隨想錄之后的想法
● 自己實現過程中遇到哪些困難
● 今日收獲,記錄一下自己的學習時長
狀態
思路理解完成 30%
代碼debug完成 60%
代碼模板總結并抽象出來 100%
題目
704 二分查找
題目鏈接:https://leetcode.cn/problems/binary-search/
文章講解:https://programmercarl.com/0704.%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE.html
視頻講解:https://www.bilibili.com/video/BV1fA4y1o715
狀態:進度 45%
思路:要仔細debug一下閉區間、左開右閉的寫法。
27. 移除元素
題目建議: 暴力的解法,可以鍛煉一下我們的代碼實現能力,建議先把暴力寫法寫一遍。 雙指針法 是本題的精髓,今日需要掌握,至于拓展題目可以先不看。
題目鏈接:https://leetcode.cn/problems/remove-element/
文章講解:https://programmercarl.com/0027.%E7%A7%BB%E9%99%A4%E5%85%83%E7%B4%A0.html
視頻講解:https://www.bilibili.com/video/BV12A4y1Z7LP
狀態:60%
977.有序數組的平方
題目建議: 本題關鍵在于理解雙指針思想
題目鏈接:https://leetcode.cn/problems/squares-of-a-sorted-array/
文章講解:https://programmercarl.com/0977.%E6%9C%89%E5%BA%8F%E6%95%B0%E7%BB%84%E7%9A%84%E5%B9%B3%E6%96%B9.html
視頻講解:
https://www.bilibili.com/video/BV1QB4y1D7ep
狀態:45%
學習記錄
數組
1、在內存中的存儲方式
- 數組下標都是從0開始的。
- 數組內存空間的地址是連續的
因為數組在內存空間的地址是連續的,所以我們在刪除或者增添元素的時候,就難免要移動其他元素的地址。
數組的元素是不能刪的,只能覆蓋。
根據 左閉右開,左閉右閉 兩種區間規則 寫出來的二分法
二分查找法的前提
- 數組為有序數組
- 同時題目還強調數組中無重復元素,因為一旦有重復元素,使用二分查找法返回的元素下標可能不是唯一的
時間投入
兩個小時過了一下兩天的題目。
找到了一點點感覺。思路都是對的,現在重點訓練落地正確準確率。(其實就是深度理解和背模板)
代碼模板
二分查找
閉區間
# 閉區間
def binary_search(nums: list[int], target: int) -> int:left, right = 0, len(nums) - 1 # 閉區間 [left, right]while left <= right: # 終止條件:left > rightmid = left + (right - left) // 2 # 避免溢出if nums[mid] == target:return midelif nums[mid] < target:left = mid + 1 # 目標在右半部分else:right = mid - 1 # 目標在左半部分return -1 # 未找到
關鍵點:
? 循環條件:left <= right
(閉區間)。
? 中間值計算:mid = left + (right - left) // 2
(避免 (left + right)
溢出)。
? 返回值:找到時返回 mid
,否則返回 -1
。
左閉右開
def binary_search(nums: list[int], target: int) -> int:left, right = 0, len(nums) # 初始化右開區間 [left, right)while left < right: # 終止條件:left == rightmid = left + (right - left) // 2if nums[mid] == target:return midelif nums[mid] < target:left = mid + 1 # 目標在右半部分 [mid+1, right)else:right = mid # 目標在左半部分 [left, mid)return -1 # 未找到
關鍵區別:
- 初始區間:
right = len(nums)
(開區間,不包含len(nums)
)。 - 循環條件:
left < right
(終止時left == right
)。 - 右邊界更新:
right = mid
(因為right
本身是開區間,不包含mid
)。 - 返回值:未找到時返回
-1
。
特性 | 閉區間 [left, right] | 左閉右開 [left, right) | 左開右閉 (left, right] |
---|---|---|---|
初始化 | right = len(nums) - 1 | right = len(nums) | left = -1 |
循環條件 | left <= right | left < right | left < right |
中值計算 | mid = left + (right - left)//2 | 同上 | mid = left + (right - left +1)//2 |
更新左邊界 | left = mid + 1 | left = mid + 1 | left = mid |
更新右邊界 | right = mid - 1 | right = mid | right = mid - 1 |
優勢 | 邏輯直觀,易理解 | 避免 right 越界,代碼簡潔 | 適合右側逼近問題 |