每日算法4.12之练习二分

devtools/2024/12/22 9:50:57/

力扣35搜索插入位置

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

请必须使用时间复杂度为 O(log n) 的算法

示例 1:

输入: nums = [1,3,5,6], target = 5
输出: 2
示例 2:

输入: nums = [1,3,5,6], target = 2
输出: 1
示例 3:

输入: nums = [1,3,5,6], target = 7
输出: 4

题目分析

题目很好理解,在数组中寻找一个数,如果没有则返回插入位置

解题思路

利用二分的思想快速找到位置,因为数组严格递增,如果数组中间值大于目标值,那么右半边数组的所有数都大于目标值,可直接缩小搜索范围,同理左边,便能很快定位

代码实现

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

力扣33搜索旋转排序数组

整数数组 nums 按升序排列,数组中的值 互不相同 。

在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k+1], …, nums[n-1], nums[0], nums[1], …, nums[k-1]](下标 从 0 开始 计数)。例如, [0,1,2,4,5,6,7] 在下标 3 处经旋转后可能变为 [4,5,6,7,0,1,2] 。

给你 旋转后 的数组 nums 和一个整数 target ,如果 nums 中存在这个目标值 target ,则返回它的下标,否则返回 -1 。

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

示例 1:

输入:nums = [4,5,6,7,0,1,2], target = 0
输出:4
示例 2:

输入:nums = [4,5,6,7,0,1,2], target = 3
输出:-1
示例 3:

输入:nums = [1], target = 0
输出:-1

提示:

1 <= nums.length <= 5000
-104 <= nums[i] <= 104
nums 中的每个值都 独一无二
题目数据保证 nums 在预先未知的某个下标上进行了旋转
-104 <= target <= 104

题目分析

给定一个升序的数组和目标值,在数组经过向右旋转多次后,搜索目标值

解题思路

利用二分法,因为原来的数组是升序的,即使经过旋转后,数组仍然呈现两部分的严格递增,且前一部分的初始值一定大于另一部分的末尾值,这时我们可以分为两种情况:
1.首先将旋转后的数组第一个值与中间值比较,如果中间值大,那么旋转后的分割点(也就是原数组的nums[0])在中间值以后,那么我们可以保证中间值前面都是严格递增
然后再利用二分,当目标值小于中间值时,改变右边界,注意:改变的同时一定要保证目标值也小于旋转后的nums[0]因为它有可能在后半部分
2.当中间值小于数组第一个值时,分割点在中间值前面,同理可以保证中间值后面都是严格递增

代码实现

class Solution {
public:int search(vector<int>& nums, int target) {int n=nums.size();if(!n)return -1;if(n==1)return nums[0]==target?0:-1;int l=0,r=n-1;while(l<=r){int mid=(l+r)/2;if(nums[mid]==target)return mid;if(nums[0]<=nums[mid]){if(target<nums[mid]&&target>=nums[0]){r=mid-1;}else{l=mid+1;}}else{if(target>nums[mid]&&target<=nums[n-1]){l=mid+1;}else{r=mid-1;}}}return -1;}
};

http://www.ppmy.cn/devtools/1798.html

相关文章

.NET JWT入坑

目录 ✨ 建立项目jwttest 1.创建TestJwtController 2.下载JWT 3.建实体类 4.添加post login 5.登录验证 6.测试没问题&#xff0c;写个JwtHelper 7.添加token加密类 8.测试JWT ⭐️JwtBearer 9、添加NuGet包Microsoft.AspNetCore.Authentication.JwtBearer 10、在…

JavaWeb开发03-Mybatis入门-基础操作-XML映射文件-动态SQL

一、Mybatis-入门 Java程序控制数据库 1.入门 定义实体类&#xff1a;一定要和表中的字段一一对应 配置连接数据库数据 建立Mapper层语句&#xff0c;来获取数据库数据以及将其封装到user的list中去。 2.配置SQL提示 为了进行查询数据库中有哪些表&#xff0c;所以得连接数据…

華為雲每月賬單API接入MySQL數據(優化版)

華為雲API接入MySQL數據&#xff08;優化版&#xff09; 目的&#xff1a;為了獲取華為雲每月賬單&#xff0c;對應API&#xff1a; https://support.huaweicloud.com/api-oce/mbc_00008.html?ticketST-8209549-9rRSxR7PabAB4dKwttvz3Dpb-sso 1.讀取配置文件 config.py im…

华为ensp中Hybrid接口原理和配置命令

作者主页&#xff1a;点击&#xff01; ENSP专栏&#xff1a;点击&#xff01; 创作时间&#xff1a;2024年4月19日14点03分 Hybrid接口是ENSP虚拟化中的一种重要技术&#xff0c;它既可以连接普通终端的接入链路&#xff0c;又可以连接交换机间的干道链路。Hybrid接口允许多…

【pytorch载入模型报错解决】Missing key(s) in state_dict、Unexpected key(s) in state_dict

当你试图加载模型参数时&#xff0c;爆出如下类似错误&#xff1a; Missing key(s) in state_dict: "conv1.weight", "bn1.weight", "bn1.bias", "bn1.running_mean", ... Unexpected key(s) in state_dict: "epoch", &quo…

基于Material Design风格开源、易用、强大的WPF UI控件库

前言 今天大姚给大家分享一款基于Material Design风格开源、免费&#xff08;MIT License&#xff09;、易于使用、强大的WPF UI控件库&#xff1a;MaterialDesignInXamlToolkit。 项目介绍 MaterialDesignInXamlToolkit 是一个开源、易于使用、强大的 WPF UI 控件库&#x…

TCP和UDP协议的区别

1、定义 TCP协议的全称是Transmission Control Protocol&#xff08;传输控制协议&#xff09;&#xff0c;是一种面向连接的点对点的传输层协议。 UDP协议的全称是User Datagram Protocal&#xff08;用户数据报协议&#xff09;&#xff0c;为应用程序提供一种无需建立连接…

设计模式代码实战-组合模式

1、问题描述 小明所在的公司内部有多个部门&#xff0c;每个部门下可能有不同的子部门或者员工。 请你设计一个组合模式来管理这些部门和员工&#xff0c;实现对公司组织结构的统一操作。部门和员工都具有一个通用的接口&#xff0c;可以获取他们的名称以及展示公司组织结构。…