初识C++的STL

契子

本科对C++的了解其实比较多,但是一直疏于使用C++的STL,最近在LeetCode刷题,发现大多数算法的C++都是使用STL,故打算花几天熟悉一下,重新捡起来,在实践中运用;也便于之后工作的面试。

LeetCode704. 二分查找算法(C++)

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

用到的容器–vector

本质:一个可变长的数组(与array区分,array是固定长度)

  • v.size(),求v的长度
  • 访问元素,可以直接v[i];或者使用迭代器遍历

代码实现

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

LeetCode35. 搜索插入位置(二分查找算法的变型)

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

请必须使用时间复杂度为 O(log n) 的算法。

算法思想

重点在于查找不成功后的插入位置的判断

查找不成功的判别条件是left>right
因为每一次判断只会有left或者right移动,且最终都会二分为只有一个元素的子序列,所以在判定失败的上一步一定是left=right,从而mid=left=right,接下来有两种查找失败的情况:

  • target 更大,即插入在mid后面。此时操作是left=mid+1,插入位置在left
  • target更小,即插在mid前面。此时操作是right=mid-1,因为是插入在right后面,所以应该再加1

代码实现

int searchInsert(vector<int>& nums, int target) {
        int mid, left=0, right=nums.size()-1;
        while(left <= right){
            mid = (left + right) / 2;
            if(nums[mid] == target)
               return mid;
            else if(nums[mid] > target)
               right = mid - 1;
            else 
               left = mid + 1;
        }
        
        return  mid<left ?left : right+1;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值