704. Binary Search
这道题难度不大, 解决办法就是二分法。但是在这里,可以写成两种不同的二分法:
Way1:
第一种方法就是直接通过while 循环进行二分查找:
class Solution:
def search(self, nums: List[int], target: int) -> int:
l,r=0,len(nums)-1
while l<=r:
mid=(l+r)//2
if nums[mid]>target:
r=mid-1
if nums[mid]<target:
l=mid+1
if nums[mid]==target:
return mid
return -1
但是这种方法要注意的一点在于else的使用,如果要用else则前面的第二个if要变成elif,否则会出错。
Way2:
另一种二分查找的方法是借助recursion:
class Solution:
def search(self, nums: List[int], target: int) -> int:
def binary(i,j):
if i>j:
return -1
if target<nums[(i+j)//2]:
return binary(i,(i+j)//2-1)
elif target>nums[(i+j)//2]:
return binary((i+j)//2+1,j)
else:
return (i+j)//2
return binary(0,len(nums)-1)
这种办法和上面的办法大同小异,但是区别在于用到了递归的思路
27. Remove Element
这道题对于python来说如果直接用array的对应的delate的方法会更加的简单:
Way1:
直接用arr.remove函数
class Solution(object):
def removeElement(self, nums, val):
"""
:type nums: List[int]
:type val: int
:rtype: int
"""
i=0
while i < len(nums):
if nums[i] == val:
nums.remove(nums[i])
else:
i+=1
return len(nums)
这种方法类似于暴力解法,但是因为是python的原因,所以可以这样使用
Way2:
第二种方法就是暴力解法,大体思路就是用两层for循环: 第一层用来判断是否是要移除的元素,第二层是把后面的元素全都向前移来补位
Way3:
第三种方法相对于前面两种更加的巧妙, 用双指针的的模式进行操作。 大体思路为遍历整个array, 在没有找到target元素时对slow指针的位置进行赋值,如果找到了则跳过赋值。 这种方法相较于第二种方法而言,无论是时间复杂度(n)还是空间复杂度O(1)都大幅度的提高了
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
slow=0
for fast in range(len(nums)):
if val!=nums[fast]:
nums[slow]=nums[fast]
slow+=1
return slow
整体来说这两道题都不难,算是基础题,但是考察了对于array的基本操作。这些操作包括了two pointer, recursion, and inner function的使用