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

力扣刷题记录(c++)06

目录

34. 在排序数组中查找元素的第一个和最后一个位置

题目描述:

题目解析:

代码实现:

153. 寻找旋转排序数组中的最小值 

题目描述:

题目解析:

代码实现:



题目描述:

给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。

如果数组中不存在目标值 target,返回 [-1, -1]

你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。

 

题目解析:

  • 可以注意到,数组是非递减的,这道题本质上也是查找,那么就可以使用二分查找,不过在寻找左右边界时的循环在迭代上有些区别。
  • 设置left=0,right=n-1,进行二分查找。
  • 先找左边界:
    • 如果nums[mid]>target,说明目标在左边,right更新为mid-1;
    • 如果nums[mid]<target,说明目标在右边,left更新为mid+1;
    • 如果nums[mid]=target,分为两种情况:
      • mid=0或者nums[mid]>nums[mid-1],说明mid为左边界;
      • 否则,左边界在左边,right更新为mid-1。
  • 右边界只有在如果nums[mid]=target时处理有些区别,但是大差不差。

代码实现:

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

153. 寻找旋转排序数组中的最小值 

题目描述:

已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组。例如,原数组 nums = [0,1,2,4,5,6,7] 在变化后可能得到:

  • 若旋转 4 次,则可以得到 [4,5,6,7,0,1,2]
  • 若旋转 7 次,则可以得到 [0,1,2,4,5,6,7]

注意,数组 [a[0], a[1], a[2], ..., a[n-1]] 旋转一次 的结果为数组 [a[n-1], a[0], a[1], a[2], ..., a[n-2]] 。

给你一个元素值 互不相同 的数组 nums ,它原来是一个升序排列的数组,并按上述情形进行了多次旋转。请你找出并返回数组中的 最小元素 。

你必须设计一个时间复杂度为 O(log n) 的算法解决此问题。

 

题目解析:

  • 根据时间复杂度的要求,极有可能可以用二分查找的方法解决这道问题。
  • 那么先按照模版设置出left,right,mid。然后思考如何迭代。
    • 什么情况下目标在mid右边:当nums[mid]>nums[right]时。
    • 否则,目标就在mid左边,或者就是要找的最小值。

代码实现:

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

http://www.dtcms.com/a/272331.html

相关文章:

  • HTML应用指南:利用GET请求获取全国永辉超市门店位置信息
  • Unity3D iOS闪退问题解决方案
  • PyTorch仿射变换:原理与实战全解析
  • 深入理解Java虚拟机:Java内存区域与内存溢出异常
  • 【运维架构】云计算运维架构师与基础设施,技术路线,Linux证书(标准化/定制化/CNCF,公有云/混合云/私有云)
  • 【图像处理基石】如何入门图像校正?
  • (6)机器学习小白入门 YOLOv:图片的数据预处理
  • 机器学习 YOLOv5手绘电路图识别 手绘电路图自动转换为仿真软件(如LT Spice)可用的原理图,避免人工重绘
  • Spring MVC 1
  • C++中的list的学习
  • Go语言教程-变量、常量、命名规则
  • 亚矩阵云手机破解Maio广告平台多账号风控:从“生存焦虑”到“规模化增长”的终极方案
  • 电路研究9.4——合宙Air780EP的LuatOS、CSDK跟标准AT
  • 基于开源AI大模型AI智能名片S2B2C商城小程序源码的私域流量新生态构建
  • 独立服务器选择Rocky Linux还是CentOS
  • 【数据结构】顺序表(sequential list)
  • 学习中断配置的一天(第五天)
  • 安装nginx+php环境
  • OpenCV探索之旅:多尺度视觉与形状的灵魂--图像金字塔与轮廓分析
  • 无人机识别比赛记录与分析
  • Java---IDEA
  • 【论文阅读】Decoupled Knowledge Distillation
  • 【大模型推理论文阅读】 Thinking Tokens are Information Peaks in LLM Reasoning
  • iOS 抓包详细教程:从零搭建、操作到实战调试的全流程指南
  • 图像亮度调整的简单实现
  • Flutter多线程机制深度解析
  • 【Docker基础】Docker容器与网络关联命令使用指南:深入理解容器网络连接
  • 力扣61.旋转链表
  • Windows下VScode配置FFmpeg开发环境保姆级教程
  • 面试150 LRU缓存