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

文章介绍了LeetCode中的两道经典问题,704.二分查找和27.删除元素。对于二分查找,强调了有序性和无重复元素的前提,以及区间定义的选择,并提供了代码实现。而对于删除元素问题,提出了暴力解法和双指针解法的对比,强调了双指针解法的时间和空间复杂度优势。
摘要由CSDN通过智能技术生成

目录

Leetcode 704.二分查找

​​​​​题目链接 ​​​​​​​​​​​​704.二分查找(Leetcode)

解题思路 知识来源

代码实现

 总结

Leetcode 27.删除元素

题目链接 27.删除元素(Leetcode)

解题思路

代码实现

总结


目录

Leetcode 704.二分查找

​​​​​题目链接 ​​​​​704.二分查找(Leetcode)

解题思路 知识来源

1.二分查找有两个前提,第一是 有序排列 ,第二是 无重复元素 。

2.二分法的区间定义一般分为两种,一是左闭右闭 [left, right] ,另一种是左闭右开 [left, right) 。
以数组 [2, 3, 4, 5, 8, 9] 为例,一共 6 个元素,对应下标为 0-5,当区间定义为左闭右闭时,right 初始化为 5,对应的代码为 left <= right 和 right = middle - 1 ;当区间定义为左闭右开时,right 初始化为 6 (由于元素 nums[6] 无意义,所以边界 6 为开区间) ,对应的代码为 left < right 和 right = middle 。

3.两种定义方法选择一种固定使用就好,个人建议左闭右闭,因为右边界有意义,返回结果比较清晰直观。当然,适合自己就好。

4.二分查找(折半查找)的优点:时间复杂度为logN。

5.中间值为mid=left+(right-left)/2,而不是(left+right)/2,是为了防止mid值溢出。

代码实现

int search(int* nums, int numsSize, int target){
    int left=0;
    int right = numsSize-1;
    while(left<=right)
    {
        int mid = left+(right-left)/2;
        if(nums[mid]==target)
        {
            return mid;
        }
        else if(nums[mid]<target)
        {
            left = mid+1;
        }
        else if(nums[mid]>target)
        {
            right = mid-1;
        }
    }

    return -1;
}

 总结

二分查找看起来很简单,但是还是有很多小细节需要注意。

Leetcode 27.删除元素

题目链接 27.删除元素(Leetcode)

解题思路

1.暴力解法:使用两个for循环,第一个for循环为了找到相等元素,第二个for循环为了将后面的元素向前移动覆盖掉相等的元素。

2.双指针解法:使用两个指针对一个数组进行遍历,快指针遍历数组的每一个元素,遍历的元素如果与寻找的值不相等,再赋值给慢指针。

3.时间复杂度为O(n),空间复杂度为O(1)。

代码实现

int removeElement(int* nums, int numsSize, int val){
  int fast;
  int slow = 0;
  for(fast=0;fast<numsSize;fast++)
  {
      if(nums[fast]!=val)
      {
          nums[slow] = nums[fast];
          slow++;
      }
  }
  return slow;
}

总结

对于诸如「相同元素最多保留 k 位元素」或者「移除特定元素」的问题,更好的做法是从题目本身性质出发,利用题目给定的要求提炼出具体的「保留逻辑」,将「保留逻辑」应用到我们的遍历到的每一个位置。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第二十二天的算法训练营主要涵盖了Leetcode题目中的三道题目,分别是Leetcode 28 "Find the Index of the First Occurrence in a String",Leetcode 977 "有序数组的平方",和Leetcode 209 "长度最小的子数组"。 首先是Leetcode 28题,题目要求在给定的字符串中找到第一个出现的字符的索引。思路是使用双指针来遍历字符串,一个指向字符串的开头,另一个指向字符串的结尾。通过比较两个指针所指向的字符是否相等来判断是否找到了第一个出现的字符。具体实现的代码如下: ```python def findIndex(self, s: str) -> int: left = 0 right = len(s) - 1 while left <= right: if s[left == s[right]: return left left += 1 right -= 1 return -1 ``` 接下来是Leetcode 977题,题目要求对给定的有序数组中的元素进行平方,并按照非递减的顺序返回结果。这里由于数组已经是有序的,所以可以使用双指针的方法来解决问题。一个指针指向数组的开头,另一个指针指向数组的末尾。通过比较两个指针所指向的元素的绝对值的大小来确定哪个元素的平方应该放在结果数组的末尾。具体实现的代码如下: ```python def sortedSquares(self, nums: List[int]) -> List[int]: left = 0 right = len(nums) - 1 ans = [] while left <= right: if abs(nums[left]) >= abs(nums[right]): ans.append(nums[left ** 2) left += 1 else: ans.append(nums[right ** 2) right -= 1 return ans[::-1] ``` 最后是Leetcode 209题,题目要求在给定的数组中找到长度最小的子数组,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值