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

 其实我也不是第一天打开代码随想录了,今天重新开始,希望这次不仅仅是开始

就不多写什么了,这个题目写过很多次,卡哥的视频和讲解看过多次,就直接写答案了

1-704.二分查找

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target  ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1

补充一下两种思路的异同

1.左闭右闭

  • while (left <= right) 要使用 <= ,因为left == right是有意义的,所以使用 <=
  • if (nums[middle] > target) right 要赋值为 middle - 1,因为当前这个nums[middle]一定不是target,那么接下来要查找的左区间结束下标位置就是 middle - 1
  • right = len(nums) -1

2.左闭右开

  • while (left < right),这里使用 < ,因为left == right在区间[left, right)是没有意义的
  • if (nums[middle] > target) right 更新为 middle,因为当前nums[middle]不等于target,去左区间继续寻找,而寻找区间是左闭右开区间,所以right更新为middle,即:下一个查询区间不会去比较nums[middle]
  • right = len(nums)

leetcode连接如下

https://leetcode.cn/problems/binary-search/description/

class Solution:
    def search(self, nums: List[int], target: int) -> int:
        # left, right = 0, len(nums) - 1
        # while left <= right:
        #     mid = (left + right ) // 2
        #     if nums[mid] > target:
        #         right = mid - 1
        #     elif nums[mid] < target:
        #         left = mid + 1
        #     else:
        #         return mid
        # return -1
        left, right = 0, len(nums)
        while left < right:
            mid = (left + right ) // 2
            if nums[mid] > target:
                right = mid
            elif nums[mid] < target:
                left = mid + 1
            else:
                return mid
        return -1

2-27. 移除元素

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。

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

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

双指针法是精髓

class Solution:
    def removeElement(self, nums: List[int], val: int) -> int:
        slow = 0
        long = len(nums)
        for i in range(long):
            if nums[i] != val:
                nums[slow] = nums[i]
                slow += 1
        return slow

同时练习一个自己的linux基本操作和熟悉一个git使用,放个码云吧

leetcode: 代码随想录代码逐次上传 - Gitee.com

你可能感兴趣的:(算法,leetcode,职场和发展)