2/7 算法每日N题(二分+双指针)

第一题:

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

第一题没什么细节,用笔在纸上画一下模拟一下即可

第二题:

这一道题相对其他题比较抽象,具体体现在其最后一个位置不好找,因为在编译的时候,计算mid时系统会自动向下取整,因此在处理左端点时可以向下取整得到,处理又端点时需要向上取整,同时要注意数据的溢出,这里是如何处理的。

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

我绝得这个题最关键的步骤就是,nums[mid]与target是否取等,在求开始位置的时候,不用取等,原因是else成立条件为>=那么right所指向的未必是最右边的那个元素,因为可能有重复元素,对于求最后位置时,else条件为>的目的是,使得right所指向的目标元素为最后的位置。

第三题:

class Solution {
public:int searchInsert(vector<int>& nums, int target) {int n = nums.size();int l=0,r=n-1;while(l<=r){int mid=l+(r-l)/2;if(nums[mid]<target)l=mid+1;else r=mid-1;}return l;}
};
  1. 判断中间位置的值 nums[mid] 与目标值 target 的大小关系:
    • 若 nums[mid] < target,说明目标值在右半部分,将 l 更新为 mid+1
    • 若 nums[mid] >= target,说明目标值在左半部分或者等于中间值,将 r 更新为 mid-1
  2. 循环结束后,返回 l,即为目标值在数组中的插入位置

第四题:

整数平方根最小为1,最大为本身,因此左指针指在1,右指针指在r,防止mid*mid的值溢出,将数据类型设为long long 类型

在这个平方根求解算法中,向上取整(即计算中点时使用的 mid = l + (r - l + 1) / 2 而不是 mid = l + (r - l) / 2)的主要原因是为了确保二分查找过程能够正确地收敛,特别是在处理左右边界相邻但还未找到确切平方根整数值的情况下。

这个细节主要影响的是当左边界(l)和右边界(r)相邻时的行为。常规的二分查找中点计算(向下取整)可能会导致在某些情况下循环不能正确终止,进而错过正确答案。具体到这个问题:

第五题:

class Solution {
public:int peakIndexInMountainArray(vector<int>& arr) {int l=1,r=arr.size()-2,mid;while(l<r){mid=l+(r-l+1)/2;if(arr[mid]<arr[mid-1])r=mid-1;elsel=mid;}return l;}
};

山脉即大于左右两边的山,暴力也可求解

class Solution {
public:int peakIndexInMountainArray(vector<int>& arr) {int n = arr.size();// 遍历数组内每⼀个元素,直到找到峰顶for (int i = 1; i < n - 1; i++)// 峰顶满⾜的条件if (arr[i] > arr[i - 1] && arr[i] > arr[i + 1])return i;// 为了处理 oj 需要控制所有路径都有返回值return -1;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/459670.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

React | Center 组件

在 Flutter 中有 Center 组件&#xff0c;效果就是让子组件整体居中&#xff0c;挺好用。 React 中虽然没有对应的组件&#xff0c;但是可以简单封装一个&#xff1a; index.less .container {display: flex;justify-content: center;align-items: center;align-content: ce…

Pandas 对带有 Multi-column(多列名称) 的数据排序并写入 Excel 中

Pandas 从Excel 中读取带有 Multi-column的数据 正文 正文 我们使用如下方式写入数据&#xff1a; import pandas as pd import numpy as npdf pd.DataFrame(np.array([[10, 2, 0], [6, 1, 3], [8, 10, 7], [1, 3, 7]]), columns[[Number, Name, Name, ], [col 1, col 2, co…

DIFFER,一种用于测试和验证转换程序的新工具

我们最近发布了一个新的差异测试工具&#xff0c;称为 DIFFER&#xff0c;用于查找转换后的程序中的错误和健全性违规。 DIFFER 结合了差分、回归和模糊测试的元素&#xff0c;帮助用户发现被软件重写、反膨胀和强化工具更改的程序中的错误。我们使用 DIFFER 评估了 10 个软件反…

数据库管理-第147期 最强Oracle监控EMCC深入使用-04(20240207)

数据库管理147期 2024-02-07 数据库管理-第147期 最强Oracle监控EMCC深入使用-04&#xff08;20240207&#xff09;1 发现Exadata2 Exadata监控计算节点&#xff1a;存储节点RoCE交换机管理交换机PDU 总结 数据库管理-第147期 最强Oracle监控EMCC深入使用-04&#xff08;202402…

Oracle 面试题 | 18.精选Oracle高频面试题

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

25、数据结构/二叉树相关练习20240207

一、二叉树相关练习 请编程实现二叉树的操作 1.二叉树的创建 2.二叉树的先序遍历 3.二叉树的中序遍历 4.二叉树的后序遍历 5.二叉树各个节点度的个数 6.二叉树的深度 代码&#xff1a; #include<stdlib.h> #include<string.h> #include<stdio.h> ty…

Java面向对象 封装

目录 封装的概念“高内聚&#xff0c;低耦合”封装的好处实例案例测试 封装的概念 封装是把过程和数据包围起来&#xff0c;对数据的访问只能通过已定义的接口。面向对象计算始于这个基本概念&#xff0c;即现实世界可以被描绘成一系列完全自治、封装的对象&#xff0c;这些对…

0207作业

继承&#xff1a;是 C中类的一个重要特性&#xff0c;它允许一个类从另一个类中继承成员变量和成员函数。通过继承&#xff0c;可以在子类中重用父类的代码&#xff0c;并可以根据需要进行扩展和修改。继承关系形成了类的层次结构。 虚继承&#xff1a;是一种特殊的继承方式&a…

Python 深入理解 os 和 sys 模块

Python 深入理解 os 和 sys 模块 OS 介绍代码智能连接&#xff08;拼接&#xff09;路径创建目录展示&#xff08;列出目录&#xff09;删除文件重命名文件或目录 sys 介绍代码命令行参数处理 (sys.argv)标准输入输出重定向 (sys.stdin, sys.stdout, sys.stderr)&#xff1a;解…

ShardingSphere 5.x 系列【5】Spring Boot 3 集成并实现读写分离

有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 3.1.0 本系列ShardingSphere 版本 5.4.0 源码地址:https://gitee.com/pearl-organization/study-sharding-sphere-demo 文章目录 1. 概述2. 使用限制3. 案例演示3.1 一主双从3.2 项目搭建3.3 配置3.4 测试4.…

查看NodeJs版本和查看NPM版本

Windows10 Dos命令下 查看NodeJs版本和查看NPM版本 NodeJs的命令是&#xff1a;node -v Npm的命令是&#xff1a;npm -v 下图&#xff1a; 记录下&#xff01;~

JavaScript基础(28)_获取元素的其他样式

其他样式操作的属性 clientWidth(只读)&#xff1a;获取元素的"可见宽度"&#xff0c;包括内容区和内边距(返回的是一个数字&#xff0c;不带px&#xff0c;可直接进行计算)。 clientHeight(只读)&#xff1a;获取元素的"可见高度"&#xff0c;包括内容区…