代码随想录算法训练营第一天|704.二分查找、27.移除元素
前言
已经很久没有写代码了,很多多西都已经忘记,几乎是个小白
704,自定义模块,输入
今日练习
LeetCode 704
用有限的知识写出了一部分:
- 输入
- 条件语句 ,middle与target的三种情况
二分法 第一种写[]
定义 target 是在一个在左闭右闭的区间里,也就是[left, right] 。
- while (left <= right) 要使用 <= ,因为区间中left == right是有意义的
- if (nums[middle] > target) right 要赋值为 middle - 1 ,因为当前这个nums[middle]一定不是target
- if (nums[middle] < target) left 要赋值为 middle + 1 ,同上
例如在数组:1,2,3,4,7,9,10中查找元素2,如图所示:
// 时间复杂度:O(log2)
// 空间复杂度:O(1)
代码
:
class Solution:
def search(self, nums: List[int], target: int) -> int:
left = 0
right = len(nums) - 1
middle = int((left + right) / 2)
while left <= right:
if nums[middle] < target:
left = middle + 1
middle = int((left + right) / 2)
elif nums[middle] > target:
right = middle - 1
middle = int((left + right) / 2)
else:
return middle
return -1
二分法 第二种写法[)
定义 target 是在一个在左闭右开的区间里,也就是[left, right])。
- while (left < right) 要使用 <= ,因为区间中left == right无意义的
- **if (nums[middle] > target) right 要赋值为 middle ** ,因为右开
- if (nums[middle] < target) left 要赋值为 middle + 1 ,因为当前这个nums[middle]一定不是target
例如在数组:1,2,3,4,7,9,10中查找元素2,如图所示:
// 时间复杂度:O(log2)
// 空间复杂度:O(1)
代码
:
class Solution:
def search(self, nums: List[int], target: int) -> int:
left = 0
right = len(nums)
middle = int((left + right) / 2)
while left < right:
if nums[middle] < target:
left = middle+1
middle = int((left + right) / 2)
elif nums[middle] > target:
right = middle
middle = int((left + right) / 2)
else:
return middle
return -1
LeetCode 27
思考完就想到了遇到val数组后面往前推(暴力),但没想起来怎么写
暴力求解
时间复杂度:O(n^2)
空间复杂度:O(1)
代码
:
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
i = 0
num_len = len(nums)
while i < num_len: #不用for,i不一定要执行len(nums)
if nums[i] == val:
for j in range(i+1, num_len): # 移除该元素,并将后面元素向前平移
nums[j - 1] = nums[j]
num_len -= 1
i -= 1
i += 1 #继续向后对比
return num_len
双指针法
思想:快指针取值,慢指针取下标。遇到val时,快指针向后,慢指针不动
如下图:删除元素 val = 2
时间复杂度:O(n)
空间复杂度:O(1)
代码
:
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
nums_len=len(nums)
lost=0
for fast in range(nums_len):
if nums[fast] != val:
nums[lost]=nums[fast] #更新列表
lost = lost + 1
return lost
总结
待改进
- Leetcode的代码头不清楚什么意思,后面解决
- 移除元素:暴力求解思路有,具体代码得再看看
精华
- 二分法的两种方法对应的不同细节
- 移除元素:快慢指针很有趣