代码随想录笔记--数组篇

1--二分查找法

二分查找法用于有序数组的元素查找,一般可以分为左闭右闭 写法、左闭右开 写法、左开右闭写法,其中左闭右闭写法最常用;

cpp 复制代码
#include <iostream>
#include <vector>

class Solution {
public:
    // 左闭右闭写法
    int search1(std::vector<int>& arr, int target){
        int left = 0, right = arr.size() - 1;
        while(left <= right){ // 因为是左闭右闭写法,当left == right时[left, right]也是合法的,因此left <= right
            int mid = left + (right - left) / 2;
            if(arr[mid] > target){
                right = mid - 1;
            }
            else if(arr[mid] < target){
                left = mid + 1;
            }
            else return arr[mid];
        }
        return -1; // 表示未找到
    }

    // 左闭右开写法
    int search2(std::vector<int>& arr, int target){
        int left = 0, right = arr.size();
        while(left < right){ // 因为是左闭右开写法,当left == right时[left, right)是非法的,因此left < right
            int mid = left + (right - left) / 2;
            if(arr[mid] > target){
                right = mid; // 右开
            }
            else if(arr[mid] < target){
                left = mid + 1; // 左闭
            }
            else return arr[mid];
        }
        return -1; // 表示未找到
    }

    // 左开右闭写法
    int search3(std::vector<int>& arr, int target){
        int left = -1, right = arr.size() - 1;
        while(left < right){ // 因为是左闭右开写法,当left == right时(left, right]是非法的,因此left < right
            int mid = left + (right - left) / 2;
            if(arr[mid] > target){
                right = mid - 1; // 右闭
            }
            else if(arr[mid] < target){
                left = mid; // 左开
            }
            else return arr[mid];
        }
        return -1; // 表示未找到
    }
};

int main(int argc, char *argv[]){
    std::vector<int> test = {1, 2, 3, 4, 5, 6, 7, 8, 9};
    int target = 2;
    Solution S1;
    int res1 = S1.search1(test, target);
    int res2 = S1.search2(test, target);
    int res3 = S1.search3(test, target);
    std::cout << res1 << ", " << res2 << ", " << res3 << std::endl;
    return 0;
}

2--二分查找法进阶

2-1--寻找第一个等于目标值的位置

等于号 = 放在哪个条件判断的依据:当 arrmid == target 时,应该往哪一边继续二分寻找;

cpp 复制代码
#include <iostream>
#include <vector>

class Solution {
public:
    // 左闭右闭写法
    int search1(std::vector<int>& arr, int target){
        int left = 0, right = arr.size() - 1;
        int res = -1;
        while(left <= right){
            int mid = left + (right - left) / 2;
            if(arr[mid] >= target){
                res = mid; // 记录可能的位置
                right = mid - 1;
            }
            else if(arr[mid] < target){
                left = mid + 1;
            }
        }
        if(res == -1 || arr[res] != target) return -1; //未找到target
        return res;
    }

};

int main(int argc, char *argv[]){
    std::vector<int> test = {1, 2, 2, 2, 3, 3, 4};
    int target = 2;
    Solution S1;
    int res1 = S1.search1(test, target);
    std::cout << res1 << std::endl;
    return 0;
}

2-2--寻找最后一个等于目标值的位置

等于号 = 放在哪个条件判断的依据:当 arrmid == target 时,应该往哪一边继续二分寻找;

cpp 复制代码
#include <iostream>
#include <vector>

class Solution {
public:
    // 左闭右闭写法
    int search1(std::vector<int>& arr, int target){
        int left = 0, right = arr.size() - 1;
        int res = -1;
        while(left <= right){
            int mid = left + (right - left) / 2;
            if(arr[mid] > target){
                right = mid - 1;
            }
            else if(arr[mid] <= target){
                res = mid; // 记录可能的位置
                left = mid + 1;
            }
        }
        if(res == -1 || arr[res] != target) return -1; //未找到target
        return res;
    }

};

int main(int argc, char *argv[]){
    std::vector<int> test = {1, 2, 2, 2, 3, 3, 4};
    int target = 2;
    Solution S1;
    int res1 = S1.search1(test, target);
    std::cout << res1 << std::endl;
    return 0;
}
相关推荐
梦帮科技7 小时前
AI 音乐产品的发布工程:验证门、数据发布、回滚与生产运维纪律
数据结构·数据库·架构·node.js·音视频·动态规划·推荐算法
C++ 老炮儿的技术栈8 小时前
我们在设计tcp协议时,要传一个字符串过去,报文:头十长度十内容,是否要把‘\0‘也填入,长度是否包含‘\0‘
开发语言·数据结构·c++·mfc·c
青山木12 小时前
Hot 100 --- 最长有效括号
java·数据结构·算法·leetcode·动态规划
爱吃苹果的日记本14 小时前
数据结构第五课
数据结构·学习
Logic10115 小时前
C语言/数据结构贪心算法题解:买卖股票的最佳时机——一次交易最大利润(O(n)时间O(1)空间)
c语言·数据结构·贪心算法·数组·时间复杂度·算法题·股票交易
Logic10115 小时前
C语言/数据结构位运算题解:异或XOR找出货币交易中的“独特面值“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
ctlover15 小时前
数据结构:树
数据结构·python
景熙552317 小时前
14.Java 集合框架从入门到源码万字详解(含 ArrayList/LinkedList/HashMap 源码、泛型通配符、红黑树)
java·开发语言·数据结构·算法
SendTomo18 小时前
.ico透明图标在线生成下载平台深度解析
大数据·数据结构·数据库·数据仓库·个人开发
GG-_-Bond18 小时前
9.1kv存储持久化模拟面试
linux·c语言·数据结构·c++