81.搜索旋转排序数组II

2024-06-06 04:58
文章标签 数组 搜索 排序 ii 旋转 81

本文主要是介绍81.搜索旋转排序数组II,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

81.搜索旋转排序数组II

解题思路:

package leadcode;/*** @author : icehill* @description : 搜索旋转排序数组II* 已知存在一个按非降序排列的整数数组 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,4,4,5,6,6,7] 在下标 5 处经旋转后可能变为 [4,5,6,6,7,0,1,2,4,4] 。* 给你 旋转后 的数组 nums 和一个整数 target ,请你编写一个函数来判断给定的目标值是否存在于数组中。如果 nums 中存在这个目标值 target ,则返回 true ,否则返回 false 。* 示例1:* 输入:nums = [2,5,6,0,0,1,2], target = 0* 输出:true* 示例2:* 输入:nums = [2,5,6,0,0,1,2], target = 3* 输出:false* 提示:* 1 <= nums.length <= 5000* -10^4 <= nums[i] <= 10^4* 题目数据保证 nums 在预先未知的某个下标上进行了旋转* -10^4 <= target <= 10^4* 进阶:* 这是 搜索旋转排序数组的延伸题目,本题中的nums 可能包含重复元素。* 这会影响到程序的时间复杂度吗?会有怎样的影响,为什么?* 来源:力扣(LeetCode)* 链接:https://leetcode-cn.com/problems/search-in-rotated-sorted-array-ii* 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。* 解题思路:* 即使数组被旋转过,我们仍然可以利用这个数组的递增性,使用二分查找。对于当前的中点,* 如果它指向的值小于等于右端,那么说明右区间是排好序的;反之,那么说明左区间是排好序的。* 如果目标值位于排好序的区间内,我们可以对这个区间继续二分查找;反之,我们对于另一半区* 间继续二分查找。* 注意,因为数组存在重复数字,如果中点和左端的数字相同,我们并不能确定是左区间全部* 相同,还是右区间完全相同。在这种情况下,我们可以简单地将左端点右移一位,然后继续进行二分查找。* @date : 2021-05-19*/
public class Solution81 {public static void main(String[] args) {int[] nums = {1, 0, 1, 1, 1};Solution81 solution81 = new Solution81();System.out.println(solution81.search(nums, 3));System.out.println(solution81.search(nums, 0));}public boolean search(int[] nums, int target) {int left = 0;int right = nums.length - 1;while (left <= right) {int mid = (left + right) / 2;if (nums[mid] == target) {return true;}if (nums[left] == nums[mid] && nums[mid] == nums[right]) {//无法判断哪个区间是增序的left++;right--;} else if (nums[left] <= nums[mid]) {//左区间有序if (nums[left] <= target && target < nums[mid]) {right = mid - 1;} else {left = mid + 1;}} else {//右区间有序if (nums[mid] < target && target <= nums[right]) {left = mid + 1;} else {right = mid - 1;}}}return false;}
}

这篇关于81.搜索旋转排序数组II的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1035147

相关文章

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

hdu1240、hdu1253(三维搜索题)

1、从后往前输入,(x,y,z); 2、从下往上输入,(y , z, x); 3、从左往右输入,(z,x,y); hdu1240代码如下: #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#inc

hdu2241(二分+合并数组)

题意:判断是否存在a+b+c = x,a,b,c分别属于集合A,B,C 如果用暴力会超时,所以这里用到了数组合并,将b,c数组合并成d,d数组存的是b,c数组元素的和,然后对d数组进行二分就可以了 代码如下(附注释): #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<que

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

hdu 1166 敌兵布阵(树状数组 or 线段树)

题意是求一个线段的和,在线段上可以进行加减的修改。 树状数组的模板题。 代码: #include <stdio.h>#include <string.h>const int maxn = 50000 + 1;int c[maxn];int n;int lowbit(int x){return x & -x;}void add(int x, int num){while

hdu 1285(拓扑排序)

题意: 给各个队间的胜负关系,让排名次,名词相同按从小到大排。 解析: 拓扑排序是应用于有向无回路图(Direct Acyclic Graph,简称DAG)上的一种排序方式,对一个有向无回路图进行拓扑排序后,所有的顶点形成一个序列,对所有边(u,v),满足u 在v 的前面。该序列说明了顶点表示的事件或状态发生的整体顺序。比较经典的是在工程活动上,某些工程完成后,另一些工程才能继续,此时

poj 2187 凸包or旋转qia壳法

题意: 给n(50000)个点,求这些点与点之间距离最大的距离。 解析: 先求凸包然后暴力。 或者旋转卡壳大法。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <s

hdu 4517 floyd+记忆化搜索

题意: 有n(100)个景点,m(1000)条路,时间限制为t(300),起点s,终点e。 访问每个景点需要时间cost_i,每个景点的访问价值为value_i。 点与点之间行走需要花费的时间为g[ i ] [ j ] 。注意点间可能有多条边。 走到一个点时可以选择访问或者不访问,并且当前点的访问价值应该严格大于前一个访问的点。 现在求,从起点出发,到达终点,在时间限制内,能得到的最大

AI基础 L9 Local Search II 局部搜索

Local Beam search 对于当前的所有k个状态,生成它们的所有可能后继状态。 检查生成的后继状态中是否有任何状态是解决方案。 如果所有后继状态都不是解决方案,则从所有后继状态中选择k个最佳状态。 当达到预设的迭代次数或满足某个终止条件时,算法停止。 — Choose k successors randomly, biased towards good ones — Close