LeetCode第[33]题(Java):Search in Rotated Sorted Array
题目:在翻转有序中搜索
难度:Medium
题目内容:
Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.
(i.e., [0,1,2,4,5,6,7] might become [4,5,6,7,0,1,2]).
You are given a target value to search. If found in the array return its index, otherwise return -1.
You may assume no duplicate exists in the array.
Your algorithm's runtime complexity must be in the order of O(log n).
翻译:
假设一个按升序排序的数组在事先不知道旋转点的情况下翻转。
(即。0,1,2,4,5,6,7可能变成4,5,6,7,0,1,2)。
您获得了搜索的目标值。如果在数组中找不到它的索引,否则返回-1。
数组中不存在重复。
您的算法的运行时复杂度应该为O(log n)
我的思路:要复杂度O(log n),但是数组只是基本有序,而排序算法的最佳情况也要O(N),本弱鸡想不出什么很好方法。。。
那就强行上吧,先插入排序一波,再二分法搜索。
然而最后要返回下标,再排序后下标会发生变化,所以再新建一个数组存储下标,在排序过程中,此数组相应的值跟着一起移动。
MyCode:
public int search(int[] nums, int target) {
int[] index = new int[nums.length];
for (int i = 0; i < nums.length; i++) {
index[i] = i;
}
insertSort(nums, index);
return binaryFind(nums, target, index);
}
static int binaryFind(int[] nums, int target, int[] index) {
int low = 0;
int high = nums.length - 1;
while (low <= high) {
int mid = low + (high - low)/2;
if (nums[mid] == target) {
return index[mid];
} else if (nums[mid] > target) {
high = mid - 1;
} else {
low = mid + 1;
}
}
return -1;
}
static void insertSort(int[] nums, int[] index) {
for (int i = 1; i < nums.length; i++) {
int temp = nums[i];
int temp2 = index[i];
int j = i - 1;
while (j > -1 && nums[j] > temp) {
nums[j+1] = nums[j];
index[j+1] = index[j];
j--;
}
nums[j+1] = temp;
index[j+1] = temp2;
}
}
我的算法复杂度:O(N2),因为插入排序的最坏情况就是O(N2)。
编码过程中出现的问题:
1、把插入排序的逻辑给忘了。。
答案代码:
public int search(int[] A, int target) {
int n = A.length;
int lo=0,hi=n-1;
while(lo<hi){
int mid=(lo+hi)/2;
if(A[mid]>A[hi]) lo=mid+1;
else hi=mid;
}
int rot=lo;
lo=0;hi=n-1;
while(lo<=hi){
int mid=(lo+hi)/2;
int realmid=(mid+rot)%n;
if(A[realmid]==target)return realmid;
if(A[realmid]<target)lo=mid+1;
else hi=mid-1;
}
return -1;
}
答案复杂度:O(logN)
答案思路:首先利用数组局部仍然有序的特点,和 A[mid]>A[hi] 的条件,以二分法定位到最小的那一个值的下标,注意当 A[mid]<=A[hi] 的时候,应该是hi=mid,因为此时的mid有可能就是最小点,所以不能放过。【当要求的点不是直接定位的mid的时候(等循环结束),mid 有可能就是最终的值,下一层的 lo 和 hi 的取值不能都把mid排除, 其中一个就是mid】
找到最小点后,记录下来,然后继续对原数组进行二分法搜索,然而,参与比较的mid应该改成realMid=(mid+rot)%n
以[4,5,6,7,0,1,2]为例,找到最小值(真起点)0的下标4后,取mid=(0+6)/2 = 3,而真正的中点下标应该等于(mid+rot)%n = (3+4)%7 = 0
之后的向左右移动是一样的,所以还是变化mid的值即可。
LeetCode第[33]题(Java):Search in Rotated Sorted Array的更多相关文章
- 【LeetCode每天一题】Search in Rotated Sorted Array(在旋转数组中搜索)
Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.(i.e., ...
- LeetCode(力扣)——Search in Rotated Sorted Array 搜索旋转排序数组 python实现
题目描述: python实现 Search in Rotated Sorted Array 搜索旋转排序数组 中文:假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1 ...
- 【Leetcode】【Hard】Search in Rotated Sorted Array
Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 migh ...
- leetcode 153. Find Minimum in Rotated Sorted Array 、154. Find Minimum in Rotated Sorted Array II 、33. Search in Rotated Sorted Array 、81. Search in Rotated Sorted Array II 、704. Binary Search
这4个题都是针对旋转的排序数组.其中153.154是在旋转的排序数组中找最小值,33.81是在旋转的排序数组中找一个固定的值.且153和33都是没有重复数值的数组,154.81都是针对各自问题的版本1 ...
- LeetCode: Search in Rotated Sorted Array II 解题报告
Search in Rotated Sorted Array II Follow up for "LeetCode: Search in Rotated Sorted Array 解题报告& ...
- [LeetCode] Search in Rotated Sorted Array II [36]
称号 Follow up for "Search in Rotated Sorted Array": What if duplicates are allowed? Would t ...
- LeetCode 33. Search in Rotated Sorted Array(在旋转有序序列中搜索)
Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. (i.e. ...
- LeetCode 33 Search in Rotated Sorted Array [binary search] <c++>
LeetCode 33 Search in Rotated Sorted Array [binary search] <c++> 给出排序好的一维无重复元素的数组,随机取一个位置断开,把前 ...
- LeetCode题解33.Search in Rotated Sorted Array
33. Search in Rotated Sorted Array Suppose an array sorted in ascending order is rotated at some piv ...
- [LeetCode] Search in Rotated Sorted Array I (33) && II (81) 解题思路
33. Search in Rotated Sorted Array Suppose a sorted array is rotated at some pivot unknown to you be ...
随机推荐
- 巨蟒python全栈开发数据库攻略1:基础攻略
1.什么是数据库? 2.数据库分类 3.数据库简单介绍 4.安装数据库 5.修改root密码 6.修改字符集 7.sql介绍 8.简单sql操作
- IOS数据持久化之归档NSKeyedArchiver, NSUserDefaults,writeToFile
//2.文件读写 //支持:NSString, NSArray , NSDictionay, NSData //注:集合(NSArray, NSDictionay)中得元素也必须是这四种类型, 才能够 ...
- poco库 RSA加解密
#include "poco/Crypto/Cipher.h"#include "poco/Crypto/CipherFactory.h"#include &q ...
- 认识与学习BASH(下)
1.设定数组的变量与内容:var[index]=content,数组的读取:建议直接以$(数组)的方式来读取 例:echo“${var[1]},${var[2]},${var[3]}” 2.变量内容的 ...
- day4-递归
递归 特点 递归算法是一种直接或者间接地调用自身算法的过程.在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解. 递归算法解决问题的特点: (1) 递归就是在 ...
- 转:oracle物化视图学习笔记
最近学习了一下物化视图,正好经理不在,把学习结果贴出来供大家一起研究一下吧. 先看一下物化视图的大概含义吧,感觉baidu的定义还不错 物化视图,它是用于预先计算并保存表连接或聚集等耗时较多的操作的结 ...
- LeetCode:前K个高频元素【347】
LeetCode:前K个高频元素[347] 题目描述 给定一个非空的整数数组,返回其中出现频率前 k 高的元素. 示例 1: 输入: nums = [1,1,1,2,2,3], k = 2 输出: [ ...
- LeetCode:路径总和II【113】
LeetCode:路径总和II[113] 题目描述 给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径. 说明: 叶子节点是指没有子节点的节点. 示例:给定如下二叉树, ...
- 微信小程序学习笔记(4)--------框架之逻辑层
逻辑层 逻辑层(App Service):小程序框架的逻辑层是由JavaScript编写的,逻辑层将数据进行处理后发送给视图层,同时接受视图层的事件反馈. App进行程序注册,Page进行页面注册 g ...
- IO 复习笔记
输入流,从源到流中:输出流,从流到目的地. 1. 操作文件: 1).写入:FileOutputStream或者FileWriter 2).读取:FileInputStream或者Fil ...