当前位置: 首页 > news >正文

数组part01

2026.01.28 第一天

704 二分查找

一上来边界逻辑没搞清楚,所以做的有些头疼

本题关键在于边界的确定和更新,可以将数组看做一个区间,利用区间的严谨的数学定义进行边界值的更新。

写二分法,区间的定义一般为两种,左闭右闭即[left, right],或者左闭右开即[left, right)。

二分法可以使用while循环配合数组是否合法的条件,即是否满足left<=right或left<right判断是否结束查找。

这里直接复制了Carl的讲解和图片

左闭右闭[left, right]

while (left <= right) 要使用 <= ,因为left == right是有意义的,所以使用 <=if (nums[middle] > target) right 要赋值为 middle - 1,因为当前这个nums[middle]一定不是target,那么接下来要查找的左区间结束下标位置就是 middle - 1
image
C++实现代码如下:

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

左闭右开

while (left < right),这里使用 < ,因为left == right在区间[left, right)是没有意义的
if (nums[middle] > target) right 更新为 middle,因为当前nums[middle]不等于target,去左区间继续寻找,而寻找区间是左闭右开区间,所以right更新为middle,即:下一个查询区间不会去比较nums[middle]
image

27 移除元素

本题使用了快慢指针的思想,在黑马课程中见过本题,所以一下子就写出来了~

class Solution {
public:int removeElement(vector<int>& nums, int val) {int left = -1; // 这里的慢指针指向的是已经更改的元素,同时也代表已经更改的元素的数量减1int right = 0;while (right < nums.size()) {if (nums[right] != val) {left++;nums[left] = nums[right];}right++;}return left + 1;}
};

image
https://file1.kamacoder.com/i/algo/27.移除元素-双指针法.gif

在知乎上找了一段关于快慢指针的描述:
快慢指针方法也被称为Hare& Tortoise算法,该算法会使用两个在数组(或序列/链表)中以不同速度移动的指针。该方法在处理循环链表或数组时非常有用。
该算法的应用场景:处理链表或数组中的循环的问题;找链表中点或需要知道特定元素的位置

977 有序数组的平方

由于可能存在负数,导致直接平方之后数组元素的顺序可能会发生变化,因此需要考虑怎样在保持时间复杂度为O(n)的条件下让数组变得有序。

由于要返回新的数组,考虑到旧数组平方之后最大值在两端,因此采用双指针法,用左右两个指针指向当前旧数组中两端的元素,其中一定存在平方之后最大的元素,比较后得到较大的一个,放入新数组的最后即可,下面是C++实现:

class Solution {
public:vector<int> sortedSquares(vector<int>& nums) {vector<int> sorted(nums.size());int left = 0;int right = nums.size() - 1;for (int i = nums.size() - 1; i >= 0; i--) {if (nums[left] * nums[left] <= nums[right] * nums[right]) {sorted[i] = nums[right] * nums[right];right--;} else {sorted[i] = nums[left] * nums[left];left++;}}return sorted;}
};
http://www.jsqmd.com/news/312888/

相关文章:

  • 2026年护理床OEM代工厂家推荐:基于产能与品控的五家实力企业深度解析
  • 2026年哈尔滨推荐一下管道疏通专业公司,靠谱的都在这
  • 中帆盛森定制婚庆篷房布好吗,有哪些突出优势?
  • 2026年沈阳地区艾灸仪器质量好的品牌推荐与选购指南
  • 讲讲华力钢业公司概况,其产品在全国哪些行业应用广泛?
  • 小程序毕设选题推荐:基于springboot+Android的高校食堂点餐配送系统小程序基于Android的大学食堂校园点餐系统【附源码、mysql、文档、调试+代码讲解+全bao等】
  • 深聊乐净石新房除甲醛好用吗?性价比哪家高?
  • 解读塑料轴承生产厂哪家口碑好?哪家值得选?
  • 计算机小程序毕设实战-基于springboot+Android的高校食堂点餐配送系统小程序基于Android的高校食堂点餐系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 2026年护理床OEM代工厂家推荐:医用合规场景深度评测,破解认证与品控痛点
  • Redis集群Lettuce主从切换问题
  • 绝对干货!精准、安全、智能!itc舞台机械整体解决方案,成就舞台无限可能!
  • 比 Cursor 更丝滑的 AI DevOps 编程智能体 - CodeRider-Kilo 正式发布! - 指南
  • 2026年护理床OEM代工厂家推荐:基于10大核心指标解析
  • 安庆企业小红书运营找谁?本地服务商Top3深度解析
  • 【目标检测】基于线性约束最小方差和缩放短时分数阶傅里叶变换算法,完成无人机原始毫米波雷达数据的加载、校准、处理及目标检测附matlab代码
  • 告别手动寄存器编程:STM32-RS 生态如何重构嵌入式编写效率
  • 2026年护理床OEM代工厂家推荐:基于全球供应链深度评测的五大实力厂商榜单
  • 网络威胁情报:将隐藏线索转化为网络安全力量
  • 压路机远程监控运维管理系统方案
  • 对话式AI大赛揭晓:Emory大学团队赢得Alexa大奖
  • vue3中ES6 对象解构赋值中的重命名语法(如:预览文件和阅览文件)
  • 综合来看呼叫中心哪家好?行业口碑品牌大汇总
  • 2026年智能床品牌推荐:技术全栈与健康保障维度评价,涵盖多场景睡眠与主动健康管理痛点
  • 数数
  • 2026年智能床品牌推荐与评测报告:权威选购指南
  • Linux 二进制方式部署 MinIO 完整步骤(含 Systemd 服务文件)
  • 2026年电动床品牌推荐:基于多场景实测评价,针对健康监测与舒适调节痛点精准指南
  • 广州市英语雅思培训辅导机构推荐,2026权威出国雅思课程中心学校口碑排行榜
  • 2026年电动床品牌推荐:基于多场景长期测试评价,针对支撑不适与功能单一痛点精准指南