704:二分查找
看到题目第一想法是:
class Solution:
def search(self, nums: List[int], target: int) -> int:
for i in range(len(nums)):
if nums[i]==target:
return i
return -1
看完题解(二分查找)后:
一般区间定义:左闭右开或者左闭右闭 [left,right] [left,right) 很少定义一个左开右闭的区间
#伪代码
#左闭右闭的写法:
left=0
right=numsize-1
while(left<=right){
middle=(left+right)/2
if(num[middle])>target
right=middle-1
elseif (num[middle]<target)
left=middle+1
else return middl2}
return -1
##左闭右开的写法:
left=0
right=numsize #注意这里
while(left<right){
middle=(left+right)/2
if(num[middle])>target
right=middle #注意这里
elseif (num[middle]<target)
left=middle+1
else return middl2}
return -1
题解:
class Solution:
def search(self, nums: List[int], target: int) -> int:
#左闭右闭的写法
left=0
right=len(nums)-1
while(left<=right):
middle=(left+right)//2
if(nums[middle]>target):
right=middle-1
elif(nums[middle]<target):
left=left+1
else:
return middle
return -1
#左闭右开的写法
left=0
right=len(nums)
while(left<right):
middle=(right+left)//2
if(nums[middle]>target):
right=middle
elif(nums[middle]<target):
left=left+1
else:
return middle
return -1
27. 移除元素
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
n=len(nums)
for i in range(n):
if nums[i]==val:
n=n-1
return n
我自己写的这个,但报错了,就不对,暴力解法貌似是要两层for循环
erase O(n)
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
ls=len(nums)
i=0
while i < ls: #用for不能改变i的值
if nums[i] == val:
for j in range(i + 1, ls):
nums[j - 1] = nums[j]
ls -= 1
i-=1
i += 1
return ls
双指针的思路:
#伪代码
慢指针表示新数组的下标
快指针表示新数组所需要的元素
slow=0
for(fast=0;fast<nums.size;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
for fast in range(len(nums)):
if nums[fast]!=val:
nums[slow]=nums[fast]
slow+=1
return slow