33. 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 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.
链接: http://leetcode.com/problems/search-in-rotated-sorted-array/
题解:Rotated array中查找值,使用Binary Search,要注意数组是向左shift或者是向右shift,保持在一个单调递增的部分进行查找。
简单的三种情况 - 1) 不平移 1234567
2) 向左3位 4567123
3) 向右3位 5671234
时间复杂度 O(logn), 空间复杂度 O(1)
public class Solution {
public int search(int[] nums, int target) { //binary search
if(nums == null || nums.length == 0)
return 0;
int lo = 0, hi = nums.length - 1;
while(lo <= hi) {
int mid = lo + (hi - lo) / 2;
if(nums[mid] == target)
return mid;
else if(nums[mid] < nums[hi]) { // right half sorted
if(target > nums[mid] && target <= nums[hi]) //e.g. target = 5, 1-2-3-4-5-6-7, 6-7-1-2-3-4-5
lo = mid + 1;
else //e.g target = 5, 5-6-7-1-2-3-4
hi = mid - 1;
} else { // left half sorted
if(target < nums[mid] && target >= nums[lo]) //e.g. target = 3, 3-4-5-6-7-1-2
hi = mid - 1;
else //e.g. target = 3, 4-5-6-7-1-2-3
lo = mid + 1;
}
}
return -1;
}
}
二刷:
Java:
反而写得比较复杂了。不过原理就是用nums[mid]和nums[right]进行比较,保持mid左边或者右边一段是有序的,再根据target与 nums[mid] 和nums[right]的关系来完成进一步的二分。 看到3天前StefanPochmann又发了一个帖子,可以加入Integer.MIN_VALUE或者Integer.MAX_VALUE来进行普通二分,非常巧妙,放在reference里以后看。
Time Complexity - O(logn), Space Complexity - O(1)
public class Solution {
public int search(int[] nums, int target) { // assume no duplicates
if (nums == null || nums.length == 0) {
return -1;
}
int lo = 0, hi = nums.length - 1;
while (lo <= hi) {
int mid = lo + (hi - lo) / 2;
if (target == nums[mid]) {
return mid;
} else if (target < nums[mid]) {
if (nums[mid] < nums[hi]) { // right part sorted
hi = mid - 1;
} else{
if (target <= nums[hi]) {
lo = mid + 1;
} else {
hi = mid - 1;
}
}
} else {
if (nums[mid] < nums[hi]) {
if (target > nums[hi]) {
hi = mid - 1;
} else {
lo = mid + 1;
}
} else {
lo = mid + 1;
}
}
}
return -1;
}
}
题外话:
今天被Two Sigma的Recruiter联系,聊了一下之后感觉对方十分专业。打算递交简历以后再拖延一段时间,来进行复习准备。更需要练习的是反应速度,脑力,分析能力,交流能力,专注程度,以及做题的速度和准确度。
三刷:
使用了一刷的逻辑。还是Binary Search,就是先判断是否nums[mid] == target,再判断这个sorted array是向左还是右平移,哪一部分仍然是有序的。接下来根据上面的信息来判断如何二分。
Java:
Time Complexity - O(logn), Space Complexity - O(1)。
public class Solution {
public int search(int[] nums, int target) {
if (nums == null || nums.length == 0) return -1;
int lo = 0, hi = nums.length - 1;
while (lo <= hi) {
int mid = lo + (hi - lo) / 2;
if (target == nums[mid]) {
return mid;
} else if (nums[mid] < nums[lo]) { // right side sorted
if (target > nums[mid] && target <= nums[hi]) lo = mid + 1;
else hi = mid - 1;
} else { // left side sorted
if (target >= nums[lo] && target < nums[mid]) hi = mid - 1;
else lo = mid + 1;
}
}
return -1;
}
}
4/3/2016: 今天去Edison取税,之后和地图君一块吃了一家H-Mart附近的东北菜馆。人很少,周日中午加上我们一共就三桌,不过味道挺不错。 吃了烤羊肉串,豆腐脑,煎饼果子,韭菜盒子,锅包肉,地三鲜,酸菜排骨等等,特别对我的胃口。咸豆腐脑可能还是来美帝这么久第一次吃到,好羡慕住附近的朋友们。地图君坚持付了帐,下次再这样我要生气了。
Reference:
https://leetcode.com/discuss/80659/clever-idea-making-it-simple
https://leetcode.com/discuss/41134/java-ac-solution-using-once-binary-search
33. Search in Rotated Sorted Array的更多相关文章
- [Leetcode][Python]33: Search in Rotated Sorted Array
# -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 33: Search in Rotated Sorted Arrayhttps ...
- [array] leetcode - 33. Search in Rotated Sorted Array - Medium
leetcode - 33. Search in Rotated Sorted Array - Medium descrition Suppose an array sorted in ascendi ...
- 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 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 ...
- 33. Search in Rotated Sorted Array & 81. Search in Rotated Sorted Array II
33. Search in Rotated Sorted Array Suppose an array sorted in ascending order is rotated at some piv ...
- 刷题33. Search in Rotated Sorted Array
一.题目说明 这个题目是33. Search in Rotated Sorted Array,说的是在一个"扭转"的有序列表中,查找一个元素,时间复杂度O(logn). 二.我的解 ...
- [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(在旋转有序序列中搜索)
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(排序旋转数组的查找) 解题思路和方法
Search in Rotated Sorted Array Suppose a sorted array is rotated at some pivot unknown to you before ...
随机推荐
- jar 命令打war包
假定有一个Web应用:C:\myHomemyHome/WEB-INF/……myHome/files/……myHome/image/……myHome/src/……myHome/index.jsp在命令行 ...
- WPF以Clickonce方式发布后使用管理员身份运行
WPF的程序,在发布时采用的Clickonce方式发布,Win7的用户安装完成之后,发现执行某些操作的时候会导致程序异常.在排查后发现,是权限问题导致.如图: 是执行File.Move时引发的异常:对 ...
- MYSQL-给带特殊符号的数据库创建用户名
MYSQL-创建数据库及用户名: mysql> create database yoon;Query OK, 1 row affected (0.00 sec) mysql> grant ...
- 序列化form表单内容为json对象
SourceCode: ; (function ($) { $.fn.extend({ serializeJson: function () { var json = {}; $(this.seria ...
- 多路选择器(multiplexer)简介
1.多路器简介 简称:多路器 功能:多输入 单输出 组合逻辑电路 2.verilog代码实现: module Mux_8(addr,in1,in2,in3,in4,in5,in6,in7,in8 ...
- auto和decltype
auto 1.编译器通过分析表达式的类型来确定变量的类型,所以auto定义的变量必须有初始值. auto i=; //ok,i为整型 auto j; //error,定义时必须初始化. j=; ...
- python学习小结9:面向对象
面向对象技术 类(Class): 用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例. 类变量:类变量在整个实例化的对象中是公用的.类变量定义在类中且 ...
- execute、executeUpdate、executeQuery三者的区别(及返回值)
1. ResultSet executeQuery(String sql); 执行SQL查询,并返回ResultSet 对象. 2.int executeUpdate(String sql); 可执行 ...
- C#在Winform中改变Textbox高度三种方法
最近在做C# Winform项目,需要有一个能动态调整大小的Textbox,并且要是单行的.试了几次,单行模式的Textbox不能直接改高度.于是搜索了一下,整理出几个改变高度的方法. 1.将Text ...
- 2659: [Beijing wc2012]算不出的算式 - BZOJ
最近有点颓废,刷水题,数学题(根本不会做啊) 题意:求 q,p是两个奇质数 网上题解就直接说是几何意义,问了别人才知道 我们在坐标轴上画出来就是在线段y=(q/p)x下方的格点和y=(p/q)x下方的 ...