提示:以下是本篇文章正文内容,下面案例可供参考
一、leetcode 704 二分查找
1.题目链接:
2.独立做题问题总结
一开始做的时候用的是左闭右闭,但对于mid的更新存在问题,且对while循环的判断条件也不太明确,导致超时。
3.解法总结:
- 左闭右闭:[left, right] right = len - 1
a. while判断条件为 left <= right,因为target可取区间两端的值,即left可以等于right。
b. if语句里的对于mid的更新:因为mid在if语句判断时已经可以确定是否等于target,所以更新的时候对于nums[mid] < target,left应等于mid+1。
对于nums[mid] > target,right应为mid-1.
left, right = 0, len(nums) - 1
while left <= right:
mid = (left + right) // 2
if target == nums[mid]:
return mid
elif target < nums[mid]:
right = mid - 1
# print(f"mid == {mid}, num = {nums[mid]}")
elif target > nums[mid]:
left = mid + 1
return -1
- 左闭右开:[left, right)right = len
a. while判断条件为 left < right,因为target不可取区间右端的值。
b. if语句里的对于mid的更新:当nums[mid] > target时,right 更新为 middle,因为当前nums[middle]不等于target,而right为开区间。对于nums[mid] < target,left仍应等于mid+1。
left, right = 0, len(nums)
while left < right:
mid = (left + right) // 2
if target == nums[mid]:
return mid
elif target < nums[mid]:
right = mid
# print(f"mid == {mid}, num = {nums[mid]}")
elif target > nums[mid]:
left = mid + 1
return -1
- Details:
为防止计算left+right时溢出,可采用left +(right - left)/2, 或left +(right - left)>>1(右移1位相当于除以2)
二、leetcode 27 移除元素
1.题目链接:
2.独立做题问题总结
一开始做的时候用的是通过交换当前等于val的元素和数组最末尾元素,但对数组大小的变化更新存在问题。
3.解法总结:
- 暴力破解
通过两重循环,外循环循环元素,内循环对需要移除的元素位以后的元素进行位置更新操作。外循环while循环判断条件为l小于num(数组长度),当当前元素等于val时,num减1,不等于时l加1,判断下一位。
时间复杂度:O(n^2)
空间复杂度:O(1)
num = len(nums)
i = 0
while i < num:
if nums[i] == val:
for j in range(i + 1, num):
nums[j - 1] = nums[j]
num -= 1
else:
i += 1
return num
- 交换数组元素
若当前元素等于val,将此元素与数组末尾元素进行交换。当当前元素等于val时,num减1,不等于时l加1,判断下一位。
l = 0
num = len(nums)
while(l < num):
if nums[l] == val:
temp = nums[l]
nums[l] = nums[num - 1]
nums[num - 1] = temp
num -= 1
else:
l += 1
return num
- 双指针
双指针法只处理需要存在在数组里的数据
双指针法(快慢指针法): 通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。
快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组
慢指针:指向更新 新数组下标的位置
l, r = 0, 0
num = len(nums)
while l < num:
if nums[l] != val:
nums[r] = nums[l]
r += 1
l += 1
return r