704二分查找
题目描述:
给定一个 n
个元素有序的(升序)整型数组 nums
和一个目标值 target
,写一个函数搜索 nums
中的 target
,如果目标值存在返回下标,否则返回 -1
。
思路注意: 二分查找正确的编写姿势:
• 查找区间永远是闭区间[low, high]
• 循环条件永远是:low<=high
• 返回值永远是mid,而不要是low、high
• low、high的更新永远是low=mid+1和high=mid-1
• 对于非确定性查找,使用前后探测法,来确定搜索区间 • 先处理命中情况,再处理在左右半部分查找的情况
代码:
class Solution(object):
def search(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
low=0
high=len(nums)-1
while low<=high:
# mid=(low+high)//2
mid=low+(high-low)//2
if nums[mid]==target:
return mid
elif nums[mid]<target:
low=mid+1
else:
high=mid-1
return -1
27 移除元素
给你一个数组 nums
和一个值 val
,你需要 原地移除所有数值等于 val
的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1)
额外空间并原地修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
注意的点:
## 方法1 : 单index记录的思想,因为要求的是移除后的数组的长度实际就是不等于val的量,遍历去赋值,统计即可。
# # 方法2 ,双指针的方式去做。一个在头,如果不为val时则向右走 +1,如果为val则等待后续交换到右侧);一个在后,如果为val则向左走,-1,不为val则等待后续交换到左侧);当左边的指针不在小于右边的指针时跳出来。由于要返回的元素是不等于val的长度,所以判读最后跳出循环的左边的指针所指向的值是否等于val ,如果不等于val,则说明长度要+1 (因为长度是index+1);否则返回index 。 注意判空
class Solution(object):
def removeElement(self, nums, val):
"""
:type nums: List[int]
:type val: int
:rtype: int
"""
## 方法1 : 单index记录的思想,因为要求的是移除后的数组的长度实际就是不等于val的量,遍历去赋值,统计即可。 # index=0
# for i in range(len(nums)):
# if val !=nums[i]:
# nums[index]=nums[i]
# index+=1
# return index
### 方法2
if nums is None or len(nums)==0: #对于数组判空不能少
return 0
l=0
r=len(nums)-1
while l<r:
while l<r and nums[l]!=val :
l+=1
while l<r and nums[r]==val:
r-=1
nums[l],nums[r]=nums[r],nums[l]
if nums[l] != val:
return l+1
else:
return l