Day1|Leetcode704. 二分查找 Leetcode27. 移除元素

前言: 第一次用leetcode刷题,格式有点不适应,之前都是acm模式,需要熟悉熟悉

Leetcode 704 二分查找

题目链接704 二分查找​​​​​​

解题思路:本题目只运用二分法(原理:不断分段查找区间内的值),没有别的坑。

但是要注意几个点,要注意使用二分法的前提,其次就是目标区间的左闭右闭和左闭右开的两种常见情况:

左闭右闭:

while(right>=left){//[left,right]区间合法
        
    if(target<nums[mid]){//区间的点是否重叠
       right = mid - 1;
    }
}

左闭右开:

while(right>left){//[left,right)区间合法
        
    if(target<nums[mid]){//区间的点是否重叠
       right = mid ;
    }
}

还要注意数组默认是从零开始的

OK,下面放代码:

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int left = 0;
        int right = nums.size() - 1; 
        while (left <= right) { 
            int mid = (left + right)/2;
            if (nums[mid] > target) {
                right = mid - 1; 
            } else if (nums[mid] < target) {
                left = mid + 1; 
            } 
            if(nums[mid] == target){
                return mid;
        }

     }
        return -1;
    }
};

Leetcode 27  移除元素

题目链接27 移除元素

本题有多个解法:

这里写两个比较常见的

第一个就是暴力:

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
//两个简单的循环嵌套;元素少一个,数组统一往前移动一位,数组长度减少一;
     int long1 = nums.size();
     for(int i=0;i<long1;i++){
         if(nums[i] == val){
             for(int j=i+1;j<long1;j++){
                 nums[j-1] = nums[j];
             }
             i--;
             long1--;
         }
     }
     return long1;
    }
    
};

下面是双指针法(更小的时间复杂度)

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int slow = 0;//慢指针
        
        for(int fast = 0;fast < nums.size();fast++){//快指针,这里说明快指针已经多走一步了

            if(val != nums[fast]){//如果快指针所指的元素和目标数不相同

                nums[slow] = nums[fast];//将快指针中的值赋给慢指针

                slow++;//所求数据加一;
            }
        }
        return slow;
    }
    
};
//还需多理解一下

endl  endl  endl ;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值