wuyijia

导航

代码随想录算法训练营第一天|704.二分查找、27.移除元素

704-二分查找

讲解链接

【要点】

1.使用二分法的前提:数组要有序,且无重复元素

2.算法复杂度:

  • 时间复杂度:O(log n)
  • 空间复杂度:O(1)

【注意】

1.在二分法后续处理中可能会导致middle的范围超过 int 的数据范围。见如下,

 1 int middle = left + ((right - left) / 2);// 防止溢出 等同于(left + right)/2  算数计算顺序不同 

2.在Python中/表示浮点整除法,返回浮点结果,也就是结果为浮点数; 而//在Python中表示整数除法,返回大于结果的一个最大的整数,意思就是除法结果向下取整

【代码实现】

 1 class Solution(object):
 2     def search(self, nums, target):
 3         """
 4         :type nums: List[int]
 5         :type target: int
 6         :rtype: int
 7         """
 8         # 避免当 target 小于nums[0] 大于nums[len(nums) - 1]时多次循环运算
 9         if(target < nums[0] or target > nums[len(nums) - 1]):  
10             return -1
11         left = 0
12         right = len(nums) - 1
13 
14         while left <= right: #区间为[] ,影响的是不是取等
15             mid  = left + (right - left) // 2  #向下取整
16 
17             if nums[mid] == target:
18                 return mid
19             elif nums[mid] > target:
20                 right = mid - 1 
21             else:
22                 left = mid + 1
23         return -1    
 1 class Solution(object):
 2     def search(self, nums, target):
 3         """
 4         :type nums: List[int]
 5         :type target: int
 6         :rtype: int
 7         """
 8         # 避免当 target 小于nums[0] 大于nums[len(nums) - 1]时多次循环运算
 9         if(target < nums[0] or target > nums[len(nums)-1]):  
10             return -1
11         left = 0
12         right = len(nums)
13 
14         while left < right: #区间为[) ,不取等号
15             mid  = left + (right - left) // 2  #向下取整
16 
17             if nums[mid] == target:
18                 return mid
19             elif nums[mid] > target:
20                 right = mid 
21             else:
22                 left = mid + 1
23         return -1    

 

27-移除元素  :使用双指针法(快慢指针法)

【注意】

1.不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并原地修改输入数组

 【代码】

暴力解法:两层while循环,时间复杂度为O(n^2), 空间复杂度为O(1)

python 在 for 里修改索引变量不会影响到下一个循环,使用 while 才行

 1 class Solution(object):
 2     def removeElement(self, nums, val):
 3         """
 4         :type nums: List[int]
 5         :type val: int
 6         :rtype: int
 7         """
 8         size = len(nums)
 9         i = 0
10 
11         while(i < size):
12             if nums[i] == val:
13                 j = i+1
14                 while(j < size):
15                     nums[j - 1] = nums[j]
16                     j += 1
17                 i -= 1 
18                 size -= 1
19             i += 1
20             
21         return size

 

双指针:时间复杂度为O(n)

 1 class Solution(object):
 2     def removeElement(self, nums, val):
 3         """
 4         :type nums: List[int]
 5         :type val: int
 6         :rtype: int
 7         """
 8         fast = 0 #快指针
 9         slow = 0 #慢指针
10         size = len(nums)
11      
12         while fast < size: # 不加等于是因为,a = size 时,nums[a] 会越界
13             if nums[fast] != val:
14                 nums[slow] = nums[fast]
15                 slow += 1
16             fast += 1
17 
18         return slow        
for fast in range(size) <===> while fast < size
 

 

posted on 2023-05-10 18:17  小吴要努力  阅读(24)  评论(0编辑  收藏  举报