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

Leetcode刷题笔记7

69. x 的平方根

69. x 的平方根 - 力扣(LeetCode)

假设求17的平方根

解法一:暴力解法

从1开始依次尝试
比如1的平方是1,2的平方是4...直到5的平方,25>17,所以一定是4点几的平方,所以等于4

1  2  3  4  5  6  7
1  4  9  16 25 36 49

寻找二段性

可以把这些数抽象成一段横线

             ret
------------*--------------

ret左边的区域的平方后全是小于等于x,从这个位置开始右边的区域平方后全大于x

解法二:二分查找

先定义一个L(从1开始),一个R(x)
查找区间应该是从1到x

1. mid*mid <= x -> 落在左边区间,更新left指针,left = mid

2. mid*mid > x -> 落在右边区间,更新right指针,right = mid - 1 

代码:C++

class Solution {
public:int mySqrt(int x) {// x 有可能小于1if(x < 1) return 0; // 处理边界情况int left = 1, right = x;while(left < right){long long mid = left + (right - left + 1) / 2; // long long防溢出if(mid*mid <= x) left = mid;else right = mid - 1; // 根据模版,这里出现减法,就把求mid那里加1即可}return left;}
};

35. 搜索插入位置

35. 搜索插入位置 - 力扣(LeetCode)

寻找二段性

第一种情况:直接找到target

第二种情况:找不到target,要找插入位置

插入的位置应该是第一次比它大的这个数前面,或者最后
最终找到位置的这个值应该是大于等于target的
左边的区域全都小于target

[小于t][大于等于t           ]
-------------------------------
         ret

1. x < t -> left = mid + 1

2. x >= t -> right = mid

代码:C++

class Solution {
public:int searchInsert(vector<int>& nums, int target) {int left = 0, right = nums.size() - 1;while(left < right){int mid = left + (right - left) / 2;if(nums[mid] < target) left = mid + 1;else right = mid;}// 如果target插入位置在数组最后if(nums[left] < target) return left + 1; // right + 1也是对的,因为left和right已经相遇了return left;}
};

852. 山脉数组的峰顶索引

852. 山脉数组的峰顶索引 - 力扣(LeetCode)

先上升,到山顶,然后再下降

解法一:暴力枚举

定义一个指针从开始如果前一个数后一个数就不会是峰值,直接到下一个位置
当扫描到第一次数是大于后面的数的时候就是峰顶

时间复杂度:O(N)

优化:
山顶左边区间所有数都是大于前一个数,右边区间所有数都是小于前一个数

解法二:二分查找

二段性 - 能把数组分成两部分
中间值的下标为mid

1. 如果落在左边区间,mid包含在了最终结果里面,接下来去右边区间找
arr[mid] > arr[mid - 1] -> left = mid

2. 落在右边区间,要到左边区域找
arr[mid] < arr[mid - 1] -> right = mid - 1

代码:C++

class Solution {
public:int peakIndexInMountainArray(vector<int>& arr) {int left = 1, right = arr.size() - 2; // 抛开第一个和最后一个位置while(left < right){int mid = left + (right - left + 1) / 2;if(arr[mid] > arr[mid - 1]) left = mid;else right = mid - 1;}return left;}
};

相关文章:

  • Java集合【超详细】2 -- Map、可变参数、Collections类
  • 探索Web前端三大主流框架:Angular、React和Vue.js
  • 城市公共交通IC卡消费流程
  • Superset二次开发之更新 SECRET_KEY
  • springboot+vue 社区养老服务系统
  • MySQL中,不能在一个DML(数据操纵语言,如INSERT, UPDATE, DELETE)语句中直接引用目标表进行子查询
  • python 第一天
  • Java----Maven详解
  • Redis常用命令大全
  • 【安装笔记-20240529-Windows-Wireshark 网络协议分析工具】
  • PHP:集成Xunsearch生成前端搜索骨架
  • 关于智慧校园安全用电监测系统的设计
  • Docker搭建FRP内网穿透服务器
  • flume-ng-sql | 支持JDK8+ | 支持Flume 1.11.0 | 使用 Kotlin 编写
  • 07-操作元素(键盘和鼠标事件)
  • [译]Python中的类属性与实例属性的区别
  • 「译」Node.js Streams 基础
  • Debian下无root权限使用Python访问Oracle
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • ES6语法详解(一)
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • export和import的用法总结
  • HTTP传输编码增加了传输量,只为解决这一个问题 | 实用 HTTP
  • in typeof instanceof ===这些运算符有什么作用
  • js算法-归并排序(merge_sort)
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • mysql innodb 索引使用指南
  • PHP的类修饰符与访问修饰符
  • Python_OOP
  • 后端_ThinkPHP5
  • 基于MaxCompute打造轻盈的人人车移动端数据平台
  • 前端面试题总结
  • 日剧·日综资源集合(建议收藏)
  • 如何学习JavaEE,项目又该如何做?
  • 深度学习在携程攻略社区的应用
  • 一文看透浏览器架构
  • ​​​​​​​STM32通过SPI硬件读写W25Q64
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • ​Java基础复习笔记 第16章:网络编程
  • ​学习一下,什么是预包装食品?​
  • #14vue3生成表单并跳转到外部地址的方式
  • $.ajax,axios,fetch三种ajax请求的区别
  • (2)STL算法之元素计数
  • (2.2w字)前端单元测试之Jest详解篇
  • (20050108)又读《平凡的世界》
  • (6) 深入探索Python-Pandas库的核心数据结构:DataFrame全面解析
  • (7)摄像机和云台
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (k8s)Kubernetes 从0到1容器编排之旅
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (poj1.2.1)1970(筛选法模拟)
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (六)vue-router+UI组件库
  • (十)【Jmeter】线程(Threads(Users))之jp@gc - Stepping Thread Group (deprecated)