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

代码随想录二刷 day01 | 704. 二分查找 27. 移除元素 977. 有序数组的平方

代码随想录二刷day01

      • 704. 二分查找
      • 27. 移除元素
      • 977. 有序数组的平方

704. 二分查找

题目链接
做这种题最好现在纸上写一写,如果在大脑中想,可能一会就晕了。 二刷的时候发现了一个新的知识点 即: >>的作用
二分法第二种写法:左闭右开[left, right)

  • left <=right 时没有意义
  • if (nums[middle] > target) right 要赋值为 middle ,因为当前这个nums[middle]一定不是target
  • if (nums[middle] < target) left 要赋值为 middle ,因为当前这个nums[middle]一定不是target
class Solution {
public:int search(vector<int>& nums, int target) {int left = 0;int right = nums.size(); // 定义target在左闭右开的区间里,即:[left, right)while (left < right) { // 因为left == right的时候,在[left, right)是无效的空间,所以使用 <int middle = left + ((right - left) >> 1);if (nums[middle] > target) {right = middle; // target 在左区间,在[left, middle)中} else if (nums[middle] < target) {left = middle + 1; // target 在右区间,在[middle + 1, right)中} else { // nums[middle] == targetreturn middle; // 数组中找到目标值,直接返回下标}}// 未找到目标值return -1;}
};

int middle = left + ((right - left) >> 1) 相当于 int middle = left + ((right - left) / 2)
举个小栗子

>>: 二进制右移
举个例子: 1010 >> 1 == 0101
1010 十进制 10
0101 十进制 5
综上 >> 1 作用相当于除二

所以 left + ((right -left) >> 1) ==> left + ((right -left)/2)

为什么不直接用(left + right) /2 而用left + ((right -left) >> 1)
答: 是因为left + right 在某种情况下可能会超过基本类型所能容纳的最大值,而且 >> (位运算) 比 / 运算要快一点。

27. 移除元素

题目链接
解题思路: 双指针(快慢指针法) 一快一慢。

本题中:

  • 快指针 是用来获取新数组中的元素;
  • 慢指针是用来获取新数组中需要更新的位置。
// 时间复杂度:O(n)
// 空间复杂度:O(1)
class Solution {
public:int removeElement(vector<int>& nums, int val) {int slowIndex = 0;for(int fastIndex = 0; fastIndex < nums.size();fastIndex++){if(val != nums[fastIndex]){nums[slowIndex++] = nums[fastIndex];}}return slowIndex;}
};

注:数组的元素在内存地址中是连续的,不能单独删除数组中的某个元素,只能覆盖。


977. 有序数组的平方

题目链接
注:本题中给出的数组是有序的,则最大值应该在两端,不可能在中间。
采用双指针,从两边向中间就行遍历,并比较大小,将大的放在右端。
i 指向 起始位置,j指向终止位置

class Solution {
public:vector<int> sortedSquares(vector<int>& nums) {int k = nums.size() - 1;vector<int> result(nums.size(),0);for(int i = 0,j = nums.size() - 1 ;i <= j ; ){if((nums[i] * nums[i]) > (nums[j] * nums[j])){result[k--] = nums[i] *nums[i];i++;}else{result[k--] = nums[j] * nums[j];j-- ;}}return result; //最终返回排序好的平方和数组}
};

最终返回排序好的平方和数组。

http://www.lryc.cn/news/41379.html

相关文章:

  • Linux 终端、进程组、会话、守护进程
  • 你是否有潜质成为谷歌开发者专家?加入 GDE 成长计划,释放潜力!
  • 安全防御之防火墙篇(二)
  • 设计必备,5个png免抠素材网站,建议收藏
  • shell 脚本expect
  • 第十九天 Maven总结
  • ESP8266-NodeMCU开发板-------开发板介绍(1)
  • 【测试开发篇3】软件测试的常用概念
  • javaEE初阶 — JavaScript WebAPI
  • UE实现地面动态交互效果
  • 如何用自己的数据训练YOLOv5
  • 【基础算法】数组相关题目
  • MatBox—基于PyQt快速入门matplotlib的教程库
  • go channel使用
  • 5. QtDesignStudio中的3D场景
  • 人工智能的几个研究方向
  • 软件测试 - 常见的开发模型和测试模型
  • 从零开始的机械臂yolov5抓取gazebo仿真(四)
  • C++修炼之筑基期第一层——认识类与对象
  • IT 运营监控工具
  • java线程之Thread类的基本用法
  • 【js】多分支语句练习(2)
  • Redis与MySQL的双写一致性问题
  • Java基础:笔试题
  • spring三级缓存以及@Async产生循环引用
  • 【洛谷刷题】蓝桥杯专题突破-深度优先搜索-dfs(5)
  • 【Unity3D】Unity3D中在创建完项目后自动创建文件夹列表
  • 如何设计一个锂电池充电电路(TP4056)
  • Spark了解
  • c++STL急急急