• C++回顾录


    代码随想录 (programmercarl.com)

    数组和内存

    数组是存放在连续内存空间上的相同类型数据的集合。

    数组可以方便的通过下标索引的方式获取到下标下对应的数据。

    举一个字符数组的例子,如图所示:

    数组可以方便的通过下标索引的方式获取到下标下对应的数据。

    举一个字符数组的例子,如图所示:

    需要两点注意的是

    • 数组下标都是从0开始的。
    • 数组内存空间的地址是连续的
    • 数组的元素是不能删的,只能覆盖。

    vector list和 array的区别:

    vector的底层实现是array,严格来讲vector是容器,不是数组。

    C++数据结构——array、vector、链表_c++ array和vector_菜鸟知识搬运工的博客-CSDN博客

    二分查找

    二分法第一种写法

    第一种写法,我们定义 target 是在一个在左闭右闭的区间里,也就是[left, right] (这个很重要非常重要)

    区间的定义这就决定了二分法的代码应该如何写,因为定义target在[left, right]区间,所以有如下两点:

    很多同学这道题目做的很懵,就是不理解 快慢指针究竟都是什么含义,所以一定要明确含义,后面的思路就更容易理解了。

    删除过程如下:

    • while (left <= right) 要使用 <= ,因为left == right是有意义的,所以使用 <=
    • if (nums[middle] > target) right 要赋值为 middle - 1,因为当前这个nums[middle]一定不是target,那么接下来要查找的左区间结束下标位置就是 middle - 1
      1. class Solution {
      2. public:
      3. int search(vector<int>& nums, int target) {
      4. int left = 0;
      5. int right = nums.size() - 1; // 定义target在左闭右闭的区间里,[left, right]
      6. while (left <= right) { //left==right,区间[left, right]依然有效,所以用 <=
      7. int middle = left + ((right - left) / 2);// 防止溢出 等同于(left + right)/2
      8. if (nums[middle] > target) {
      9. right = middle - 1; // target 在左区间,所以[left, middle - 1]
      10. } else if (nums[middle] < target) {
      11. left = middle + 1; // target 在右区间,所以[middle + 1, right]
      12. } else { // nums[middle] == target
      13. return middle; // 数组中找到目标值,直接返回下标
      14. }
      15. }
      16. // 未找到目标值
      17. return -1;
      18. }
      19. };

      二分法第二种写法

      如果说定义 target 是在一个在左闭右开的区间里,也就是[left, right) ,那么二分法的边界处理方式则截然不同。

      有如下两点:

    • while (left < right),这里使用 < ,因为left == right在区间[left, right)是没有意义的
    • if (nums[middle] > target) right 更新为 middle,因为当前nums[middle]不等于target,去左区间继续寻找,而寻找区间是左闭右开区间,所以right更新为middle,即:下一个查询区间不会去比较nums[middle]
      1. class Solution {
      2. public:
      3. int search(vector<int>& nums, int target) {
      4. int left = 0;
      5. int right = nums.size(); // 定义target在左闭右开的区间里,即:[left, right)
      6. while (left < right) { // 因为left == right的时候,在[left, right)是无效的空间,所以使用 <
      7. int middle = left + ((right - left) >> 1);
      8. if (nums[middle] > target) {
      9. right = middle; // target 在左区间,在[left, middle)中
      10. } else if (nums[middle] < target) {
      11. left = middle + 1; // target 在右区间,在[middle + 1, right)中
      12. } else { // nums[middle] == target
      13. return middle; // 数组中找到目标值,直接返回下标
      14. }
      15. }
      16. // 未找到目标值
      17. return -1;
      18. }
      19. };

      双指针法

    • 双指针法(快慢指针法): 通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。

      定义快慢指针

    • 快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组
    • 慢指针:指向更新 新数组下标的位置
  • 相关阅读:
    SpringCloud实用篇02
    2023-11-08 monetdb-事务-只有RR隔离级别-原因分析
    Text-to-Image with Diffusion models的巅峰之作:深入解读​ DALL·E 2​
    【C++】静态成员变量 ( 静态成员变量概念 | 静态成员变量声明 | 静态成员变量初始化 | 静态成员变量访问 | 静态成员变量生命周期 )
    为初学者介绍轻量级目录访问协议——LDAP
    微信公众平台快速开发框架源码
    PC-lint静态检测工具集成到SourceInsight配置步骤
    汽车电子常用外围硬件电路设计
    Structured API基本使用
    使用 CSS 实现毛玻璃效果
  • 原文地址:https://blog.csdn.net/weixin_45295333/article/details/132687871