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

2023-08-07力扣今日七题-好题

链接:

剑指 Offer 11. 旋转数组的最小数字

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

题意:

找一个数组里的最小值,这个数组是有非递减数组旋转而来的,旋转n次表示把前n个数移动到数组末尾

解:

很有趣的二分,由于是非递减数组旋转而来,所以最小值往右一定小于等于最小值左侧,可以以此进行二分

如果这个数字大于nums[r],那么他一定属于最小值左侧,小于nums[r]一定属于右侧

But:唯一要注意等于的情况,因为存在重复数字,所以有可能 所有/大部分数字都是同一个,则时候无法判断在最小值左侧还是右侧,只能减小右端点。也不能和左端点比较/增大左端点,因为有可能是旋转n次转回了原数组(前面一段一个是个非递减序列,一开始的L=0算是前面一段的最小值)

一边是Easy一边是Hard是吧,真有你的嗷leetcode(大概是暴力能过的原因=-=)

实际代码:

#include<bits/stdc++.h>
using namespace std;
int findMin(vector<int>& numbers)
{int lg=numbers.size(),l=0,r=lg-1;while(l<r){int mid=l+((r-l)>>1);if(numbers[mid]==numbers[r]) r--;else if(numbers[mid]<numbers[r]) r=mid;else l=mid+1;}return numbers[l];
}
int minArray(vector<int>& numbers)
{int lg=numbers.size(),l=0,r=lg-1;while(l<r){int mid=l+((r-l)>>1);if(numbers[mid]==numbers[r]) r--;else if(numbers[mid]<numbers[r]) r=mid;else l=mid+1;}return numbers[l];
}
int main()
{vector<int> numbers;int num;while(cin>>num) numbers.push_back(num);int ans=minArray(numbers);cout<<ans<<endl;return 0;
}

限制:

  • n == numbers.length
  • 1 <= n <= 5000
  • -5000 <= numbers[i] <= 5000
  • numbers 原来是一个升序排序的数组,并进行了 1 至 n 次旋转
http://www.lryc.cn/news/113147.html

相关文章:

  • 支持多用户协同的思维导图TeamMapper
  • 【Vue】Parsing error: No Babel config file detected for ... vue
  • 2023-08-07力扣今日五题
  • ETHERCAT转PROFIBUS连接到300plc的配置方法
  • Spring Boot配置文件与日志文件
  • 可解释性分析的一些类别(草稿)(视觉)
  • HTTPS-RSA握手
  • bigemap国土管理行业应用
  • 深入探索 Splashtop Enterprise 的潜力
  • 创建型模式-单例模式
  • 2. Linux安装Git
  • 检查网站是HTTP那种协议与获取域名的ipv6地址
  • 【转】金融行业JR/T0197-2020《金融数据安全 数据安全分级指南》解读
  • FPGA学习——电子时钟模拟(新)
  • 一文读懂快速开发平台
  • Docker实战-操作Docker容器实战(二)
  • redis原理 5:同舟共济 —— 事务
  • FreeRTOS(vTaskList与vTaskGetRunTimeStats)
  • 机器学习---概述(二)
  • OPENCV C++(六)canny边缘检测+仿射变换+透射变换
  • 大量删除hdfs历史文件导致全部DataNode心跳汇报超时为死亡状态问题解决
  • 农商行基于分类分级的数据安全管控建设实践
  • 读写文件(
  • .net core 依赖注入生命周期
  • 栈和队列的实现
  • java中的垃圾收集机制
  • TCP网络服务器设计
  • 4. C++构造函数和析构函数
  • 【Spring Cloud 四】Ribbon负载均衡
  • “星闪”:60%能耗 6倍速度 1/30时延**