704. 二分查找

卡哥的题目建议 大家能把 704 掌握就可以,35. 搜索插入位置 和 34. 在排序数组中查找元素的第一个和最后一个位置 ,如果有时间就去看一下,没时间可以先不看,二刷的时候在看。先把 704写熟练,要熟悉 根据 左闭右开,左闭右闭 两种区间规则 写出来的二分法。

做题思路:

      1,先了解什么是二分查找:二分查找也称折半查找(Binary Search)。
     2,再了解折半查找的实现原理:假设我们在有三个数的有序数组中查找一个目标数,这个目标数我们一开始也不知道是有序数组中的哪个数,只能通过把目标数与有序数组的中间数进行比较,进一步缩小范围(见下面的 3)来找到目标数。如果目标数比中间的数大,则在有序数组的后半部分进行查找;如果目标数比中间数小,则在有序数组的前半部分进行比较;如果相等,则找到了比较元素的位置。折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序(升序降序都可,我们默认升序)排列。

3,确定在哪个范围里比较和查找,一开始大范围是在整个数组,当比较完了,我们就知道在前半部分或者后半部分的小范围里查找,还要更新小范围的边界值,在小范围里比较再细分成更小的范围,如此类推.........,这个范围数学化理解就是区间,区间可以分为左闭右闭,左闭右开,(这两种区间用得多),我自己比较好理解左闭右闭这种方式的。

我没用力扣的环境运行,用的是vs,看了视频后,就差不多能理解代码了,用左闭右闭方式的完整代码如下:

 1 #include <iostream>
2 using namespace std;
3 const int N = 10;
4 int a[N]; //声明全局数组
5 int BinarySearch(int a[], int target)
6 {
7 int left = 0, right = sizeof(a) - 1; //左闭右闭区间范围为[left, right],即[0, n-1],left,right,也是数组下标
8 int middle; //数组的中间数的下标
9 while (left <= right) //在一个合法的区间里比较和查找,比如[1, 1],这个区间只有1,合法
10 {
11 middle = left + (right - left) / 2; //防止溢出 等同于(left + right)/2
12 if (target < a[middle]) //查找范围在数组的前半部分
13 {
14 right = middle - 1;//因为区间是左闭右闭,所以前半部分的右边界值不包含middle
15 }
16 else if (target > a[middle]) //查找范围在数组的后半部分
17 {
18 left = middle + 1;//因为区间是左闭右闭,所以后半部分的左边界值不包含middle
19 }
20 else if (target == a[middle])//目标数和数组中间数相等
21 {
22 return middle; //直接输出数组中间数的下标,break退出循环
23 break;
24 }
25 }
26 return -1;
27 }
28 int main()
29 {
30 int n; //数组的元素个数为 n
31 cout << "请输入数组的元素个数:" << endl;
32 cin >> n;
33 cout << "请输入数组:" << endl;
34 for (int i = 0; i < n; i++)
35 {
36 cin >> a[i]; //循环输入数组中的元素
37 }
38 cout << "请输入要查找的值:" << endl;
39 int target; //目标数
40 cin >> target;
41 cout << BinarySearch(a, target) << endl;
42
43 return 0;
44 }

关于代码中的middle = left + (right - left) / 2, ,不理解溢出的话,就死记住吧。

运行结果如下:

27. 移除元素

题目链接:https://leetcode.cn/problems/remove-element/

视频讲解:https://www.bilibili.com/video/BV12A4y1Z7LP

文章讲解:https://programmercarl.com/0027.%E7%A7%BB%E9%99%A4%E5%85%83%E7%B4%A0.html

卡哥的题目建议  暴力的解法,可以锻炼一下我们的代码实现能力,建议先把暴力写法写一遍。 双指针法 是本题的精髓,今日需要掌握,至于拓展题目可以先不看。

有两种方法:暴力解法和双指针法。

暴力解法思路:用两个for循环,第一个for循环用来遍历数组,第二个for循环用来前移数据覆盖,就跟单链表的删除操作类似。完整代码如下:

 1 #include <iostream>
2 using namespace std;
3 const int N = 10;
4 int a[N]; //声明全局数组
5 int main()
6 {
7 int n; //数组的元素个数为 n
8 cout << "请输入数组的元素个数:" << endl;
9 cin >> n;
10 cout << "请输入数组:" << endl;
11 for (int i = 0; i < n; i++)
12 {
13 cin >> a[i]; //循环输入数组中的元素
14 }
15 cout << "请输入要移除元素的值:" << endl;
16 int val;
17 cin >> val;
18 for (int i = 0; i < n; i++)//第一个循环是为了把遍历数组
19 {
20 if (a[i] == val) //判断数组的哪个数和要移除的数相等
21 {
22 for (int j = i; j < n; j++)//如果有一个数相等的话,那就从当前位置开始进行前移覆盖操作
23 {
24 a[j] = a[j + 1];//数组的后一个数前移覆盖当前位置的数
25 }
26 i--; //覆盖后,数组的有效元素减一,更新i值
27 n--; //数前移移除后,原来数组的有效元素减一,更新n值
28 }
29 }
30 cout << n << endl;
31 return 0;
32 }

运行结果如下:

双指针法做题思路:也称快慢指针法,通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。这个解法不用知道为啥,为了方便操作就行。

快指针:寻找新数组的元素 ,新数组就是不含有要移除的元素的数组;

慢指针:指向更新新数组下标的位置。

完整代码如下:

 1 #include <iostream>
2 using namespace std;
3 const int N = 10;
4 int a[N]; //声明全局数组
5 int main()
6 {
7 int n; //数组的元素个数为 n
8 cout << "请输入数组的元素个数:" << endl;
9 cin >> n;
10 cout << "请输入数组:" << endl;
11 for (int i = 0; i < n; i++)
12 {
13 cin >> a[i]; //循环输入数组中的元素
14 }
15 cout << "请输入要移除元素的值:" << endl;
16 int val;
17 cin >> val;
18 int slow = 0; //慢指针的变量
19 for (int fast = 0; fast < n; fast++)
20 {
21 if (val != a[fast]) //如果fast位置上的元素和要移除的元素不相等的话,
22 {
23 a[slow] = a[fast]; //就把fast位置上的元素覆盖成slow位置上的元素
24 slow++;//slow虽然是下标,但是它也记录了新数组的个数,自己看视频就会发现
25 }
26 }
27 cout << slow << endl;
28 return 0;
29 }

 运行结果如下:

代码随想录算法训练营第一天| LeetCode 704. 二分查找、LeetCode 27. 移除元素的更多相关文章

  1. 代码随想录算法训练营day01 | leetcode 704/27

    前言   考研结束半个月了,自己也简单休整了一波,估了一下分,应该能进复试,但还是感觉不够托底.不管怎样,要把代码能力和八股捡起来了,正好看到卡哥有这个算法训练营,遂果断参加,为机试和日后求职打下一个 ...

  2. Java实现 LeetCode 704 二分查找(二分法)

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

  3. LeetCode 704. 二分查找(Binary Search)

    704. 二分查找 704. Binary Search 题目描述 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target,写一个函数搜索 nums 中的 target,如果 ...

  4. 代码随想录算法训练营day02 | leetcode 977/209/59

    leetcode 977   分析1.0:   要求对平方后的int排序,而给定数组中元素可正可负,一开始有思维误区,觉得最小值一定在0左右徘徊,但数据可能并不包含0:遂继续思考,发现元素分布有三种情 ...

  5. 代码随想录算法训练营day22 | leetcode 235. 二叉搜索树的最近公共祖先 ● 701.二叉搜索树中的插入操作 ● 450.删除二叉搜索树中的节点

    LeetCode 235. 二叉搜索树的最近公共祖先 分析1.0  二叉搜索树根节点元素值大小介于子树之间,所以只要找到第一个介于他俩之间的节点就行 class Solution { public T ...

  6. 代码随想录算法训练营day12 | leetcode 239. 滑动窗口最大值 347.前 K 个高频元素

    基础知识 ArrayDeque deque = new ArrayDeque(); /* offerFirst(E e) 在数组前面添加元素,并返回是否添加成功 offerLast(E e) 在数组后 ...

  7. 代码随想录算法训练营day10 | leetcode 232.用栈实现队列 225. 用队列实现栈

    基础知识 使用ArrayDeque 实现栈和队列 stack push pop peek isEmpty() size() queue offer poll peek isEmpty() size() ...

  8. 代码随想录算法训练营day06 | leetcode 242、349 、202、1

    基础知识 哈希 常见的结构(不要忘记数组) 数组 set (集合) map(映射) 注意 哈希冲突 哈希函数 LeetCode 242 分析1.0 HashMap<Character, Inte ...

  9. 代码随想录算法训练营day03 | LeetCode 203/707/206

    基础知识 数据结构初始化 // 链表节点定义 public class ListNode { // 结点的值 int val; // 下一个结点 ListNode next; // 节点的构造函数(无 ...

  10. 代码随想录算法训练营day21 | leetcode ● 530.二叉搜索树的最小绝对差 ● 501.二叉搜索树中的众数 ● ***236. 二叉树的最近公共祖先

    LeetCode 530.二叉搜索树的最小绝对差 分析1.0 二叉搜索树,中序遍历形成一个升序数组,节点差最小值一定在中序遍历两个相邻节点产生 ✡✡✡ 即 双指针思想在树遍历中的应用 class So ...

随机推荐

  1. Appweb+ESP学习笔记

    Appweb+ESP学习笔记 1.Appweb简介        Appweb HTTP Web服务器是最快的小型Web服务器.这是一个高性能,紧凑的嵌入式网络服务器,具有模块化,安全的核心.它支持广 ...

  2. 笔记八:linux系统编程之IO

    笔记:linux系统编程之IO 应用层     内核层     硬件层 应用层:数据结构 .java.android.C.C++,C#: l inux高级编程:涉及内核为应用层提供接口函数: 内核五大 ...

  3. [C++核心编程] 4.3、类和对象-C++对象模型和this指针

    文章目录 4.3 C++对象模型和this指针 4.3.1 成员变量和成员函数分开存储 4.3.2 this指针概念 4.3.3 空指针访问成员函数 4.3.4 const修饰成员函数 4.3 C++ ...

  4. Flutter(十) 音频+视频播放

    在Flutter中,我们有各种插件可供使用,从而实现音频和视频的播放功能. 例如,可以使用"text_to_speech"插件来将文字转换为语音,使用内置的"video_ ...

  5. 2022-09-21:有n个动物重量分别是a1、a2、a3.....an, 这群动物一起玩叠罗汉游戏, 规定从左往右选择动物,每只动物左边动物的总重量不能超过自己的重量 返回最多能选多少个动物,求一个

    2022-09-21:有n个动物重量分别是a1.a2.a3-an, 这群动物一起玩叠罗汉游戏, 规定从左往右选择动物,每只动物左边动物的总重量不能超过自己的重量 返回最多能选多少个动物,求一个高效的算 ...

  6. 2021-04-23:TSP问题 有N个城市,任何两个城市之间的都有距离,任何一座城市到自己的距离都为0。所有点到点的距 离都存在一个N*N的二维数组matrix里,也就是整张图由邻接矩阵表示。现要求

    2021-04-23:TSP问题 有N个城市,任何两个城市之间的都有距离,任何一座城市到自己的距离都为0.所有点到点的距 离都存在一个N*N的二维数组matrix里,也就是整张图由邻接矩阵表示.现要求 ...

  7. flutter填坑之旅(环境搭建篇--mac系统)

    上次配置过Mac到flutter环境,但是由于最近系统更新了,什么都没了又得从新配置,发现自己竟然好多都忘记了,看来还是得把它记下来才行 在Mac上安装并运行Flutter 最低要求: 操作系统:ma ...

  8. 代码随想录算法训练营Day24 回溯算法| 理论基础 77. 组合

    代码随想录算法训练营 回溯 什么是回溯法 回溯法也可以叫做回溯搜索法,它是一种搜索的方式. 在二叉树系列中,我们已经不止一次,提到了回溯,例如二叉树:以为使用了递归,其实还隐藏着回溯. 回溯是递归的副 ...

  9. ODOO13之七:Odoo 13开发之记录集 – 使用模型数据

    在上一篇文章中,我们概览了模型创建以及如何从模型中载入和导出数据.现在我们已有数据模型和相关数据,是时候学习如何编程与其进行交互 了.模型的 ORM(Object-Relational Mapping ...

  10. Kubernetes GoRoutineMap工具包代码详解

    1.概述 GoRoutineMap 定义了一种类型,可以运行具有名称的 goroutine 并跟踪它们的状态.它防止创建具有相同名称的多个goroutine,并且在上一个具有该名称的 goroutin ...