704. Binary Search
binary search是在sorted过的数组中才行, 设置左右指针, 注意是while(left < right) 还是 while(left <= right), 还有right/left = mid, 还是mid -/+ 1
class Solution:
def search(self, nums: List[int], target: int) -> int:
if len(nums) == 1:
for num in nums:
if target == num:
return 0
return -1
l = 0
r = len(nums) - 1
while (l <= r):
mid = (l + r) // 2
if (nums[mid] < target):
l = mid + 1
elif (nums[mid] > target):
r = mid - 1
else:
return mid
return -1
27. Remove Elements (移除元素)
题目要求是in-place, 如果num 是target value,那么把后面的往前移一个位置
Brute Force 暴力解:注意只能使用while loop 来手动调节 iterator i/L 的值
/**
错误解法: 不能使用for loop, 得用while loop
**/
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
l = len(nums)
for i in range(l):
if(nums[i] == val):
for j in range(i+1, l):
nums[j-1] = nums[j]
i-=1 # for loop中是不能改变i增减的, for loop默认就是++, 如果改变就只有用while
# print('nums[:i]', nums[:i])
l -= 1
# print('nums[:l]', nums[:l+1])
# print('nums[:l]',nums[:l+1])
return l
/**
正确写法: 使用while loop
**/
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
l = len(nums)
i = 0
while (i < l):
if(nums[i] == val):
for j in range(i+1, l):
nums[j-1] = nums[j]
# 如果元素被移除,不增加 i,继续检查当前位置的新元素
l -= 1 # 当 nums[i] 等于 val 时,通过内循环将后续元素左移一位,并减少数组长度 l。
else:
# 否则,增加 i 以检查下一个元素。
i+= 1
# print('nums[:l]',nums[:l+1])
return l
快慢指针:
fast/slow 都从index = 0 开始, fast 在前面探路看nums[fast] 是否为target val, nums[slow] 为不等于target value的值
注意: while 是 fast < size , 还是 fast <= size
#### C 代码
int removeElement(int* nums, int numsSize, int val) {
int slow = 0;
for(int fast = 0; fast < numsSize; fast++){
if(nums[fast] != val){
nums[slow] = nums[fast];
slow++;
}
}
return slow;
}
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
slow = 0
fast = 0
size = len(nums)
while (fast < size): # 注意while 的stop condition: fast如果等于len(nums) 最后fast += 1 会out of index
if nums[fast] != val:
nums[slow] = nums[fast]
slow += 1
fast += 1
return slow
| 35. 搜索插入位置
| 34. 在排序数组中查找元素的第一个和最后一个位置