LeetCode 704二分查找
题目链接:704 二分查找
coding tips:middle = left + ((right - left) // 2) 这种写法可以防止整数溢出
初始思路:因为之前对这道题有所了解,所以看到题目并不陌生,知道要用 left, right, middle三个指针解决,但是具体是left < right 还是left <= right,以及left = middle是否加一,right = middle是否减一,都不确定....所以在做第一遍时总卡bug。
课程:B站 卡哥 二分查找讲解
思路更新:主要是明白区间的定义,也就是left right两个指针所指向的数字你是否包含。
- [left, right]:两个指针指向的两个数字在本次计算的范围内。
在while条件中,left <= right。
当nums[middle] > target时:right = middle - 1,因为在上一轮已经对比过了,这一轮再等于middle的话就会重复计算,因此赋值时减一;
同理,nums[middle] < target时:left = middle + 1。
另外right在最初定义时,right = len(nums) - 1
- [left, right):两个指针指向的两个数字,左边在范围内,右边不在。
在while条件中,left < right。
基于上述的理解,此时,仅需要对右侧改变,即当nums[middle] > target时:right = middle ,因为区间不包含右侧所指向的元素,这一轮等于middle时,middle不在区间内,符合规则。
另外right在最初定义时,right = len(nums)
代码示例:
[left, right)
class Solution:
def search(self, nums: List[int], target: int) -> int:
left = 0
right = len(nums)
while left < right:
middle = left + ((right - left) // 2) # 防止整数溢出
if nums[middle] < target:
left = middle + 1
elif nums[middle] > target:
right = middle
else:
return middle
return -1
[left, right]
class Solution:
def search(self, nums: List[int], target: int) -> int:
left = 0
right = len(nums) - 1
while left <= right:
middle = left + ((right - left) // 2) # 防止整数溢出
if nums[middle] < target:
left = middle + 1
elif nums[middle] > target:
right = middle - 1
else:
return middle
return -1
LeetCode 27 移除元素
题目链接:移除元素
coding tips:所有可以定义在外面的计算都放在循环外面,可以节省计算时间(貌似)
初始思路:因为在题目中已经描写的非常清楚了,与数组的定义非常相关,即数组的元素是不能被删除的,只能被覆盖。(地址空间无法删除,申请多少就是多少)覆盖的意思不就基本可以理解为nums[j] = nums[i]。第一遍就过了,但是网站测得的时间复杂度较高。
课程:B站 卡哥 移除元素讲解
思路更新:思路没有什么变化,尝试了while,以及把len(nums)放到循环外面以后,好像速度变快了。
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
j, i = 0, 0
n = len(nums)
while i < n:
if nums[i] != val:
nums[j] = nums[i]
j += 1
i += 1
return j
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
j = 0
n = len(nums) # 在外面计算
for i in range(n):
if nums[i] != val:
nums[j] = nums[i]
j += 1
return j
第一天总结:第一次探索跟着卡哥上课,今天花费了不少时间,希望明天把时间规划好,毕竟还得忙着毕业555。加油!