LeetCode Search in Rotated Sorted Array
2015-12-30 17:31
337 查看
题目:
Suppose a sorted array is rotated at some pivot unknown to you beforehand.
(i.e.,
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.
题意:
给定一个已经排好序的数组,然后按照某个元素旋转,给定一个目标数字,求在这个旋转数组中出现这个目标数字的位置(下标),如果没有出现,那么返回-1,否则返回出现的下标。
题解:
采用和之前的搜索旋转数组的最小元素的方法,先找到那个最小的元素,用二分搜索找,找到这个元素也就意味着找到了分界点,这个最小元素左边的必定大于这个元素,而且已经排好序了,这个最小元素右边的必定也大于这个元素,而且也已经排好序了。但是为了防止出现超时现象,有几种特殊情况需要当心,首先是当这个数组的长度只为1,那么我们只要查看这个头元素是否等于target,如果相等,那么直接返回0,否则就返回-1,也就不用去执行了;如果找到这个最小元素的位置,也就是分界点,那么查看这个分界点的值是不是等于target,如果相等,直接返回这个分界点的位置(下标),否则如果这个分界点是0,那么只要做一遍二分搜索即可,否则对分界点两边都要做一遍二分搜索。
public int search(int[] nums,int target)
{
int length = nums.length;
if(length == 1 && nums[0] == target)
return 0;
else if(length == 1 && nums[0] != target)
return -1;
int min = searchBinary(nums,0,length - 1);
if(nums[min] == target)
return min;
if(min == 0)
return binary(nums,0,length - 1,target);
System.out.println(min);
if(binary(nums,0,min -1,target) != -1)
return binary(nums,0,min -1,target);
else if(binary(nums,0,min -1,target) == -1)
{
if(binary(nums,min,length - 1,target) != -1)
return binary(nums,min,length - 1,target);
else
return -1;
}
return -1;
}
public int searchBinary(int[] nums,int start,int end)
{
int length = nums.length;
if(nums[start] < nums[end])
return start;
while(nums[start] >= nums[end])
{
if(start + 1 == end)
return end;
int mid = (start + end) / 2;
if(nums[mid] >= nums[start])
start = mid;
else if(nums[mid] <= nums[end])
end = mid;
}
return end;
}
public int binary(int[] nums,int start,int end,int target)
{
if(start <= end)
{
int mid = (start + end) / 2;
if(nums[mid] == target)
return mid;
if(nums[mid] < target)
return binary(nums,mid + 1,end,target);
else if(nums[mid] > target)
return binary(nums,start,mid - 1,target);
}
return -1;
}
Suppose a sorted array is rotated at some pivot unknown to you beforehand.
(i.e.,
0 1 2 4 5 6 7might 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.
题意:
给定一个已经排好序的数组,然后按照某个元素旋转,给定一个目标数字,求在这个旋转数组中出现这个目标数字的位置(下标),如果没有出现,那么返回-1,否则返回出现的下标。
题解:
采用和之前的搜索旋转数组的最小元素的方法,先找到那个最小的元素,用二分搜索找,找到这个元素也就意味着找到了分界点,这个最小元素左边的必定大于这个元素,而且已经排好序了,这个最小元素右边的必定也大于这个元素,而且也已经排好序了。但是为了防止出现超时现象,有几种特殊情况需要当心,首先是当这个数组的长度只为1,那么我们只要查看这个头元素是否等于target,如果相等,那么直接返回0,否则就返回-1,也就不用去执行了;如果找到这个最小元素的位置,也就是分界点,那么查看这个分界点的值是不是等于target,如果相等,直接返回这个分界点的位置(下标),否则如果这个分界点是0,那么只要做一遍二分搜索即可,否则对分界点两边都要做一遍二分搜索。
public int search(int[] nums,int target)
{
int length = nums.length;
if(length == 1 && nums[0] == target)
return 0;
else if(length == 1 && nums[0] != target)
return -1;
int min = searchBinary(nums,0,length - 1);
if(nums[min] == target)
return min;
if(min == 0)
return binary(nums,0,length - 1,target);
System.out.println(min);
if(binary(nums,0,min -1,target) != -1)
return binary(nums,0,min -1,target);
else if(binary(nums,0,min -1,target) == -1)
{
if(binary(nums,min,length - 1,target) != -1)
return binary(nums,min,length - 1,target);
else
return -1;
}
return -1;
}
public int searchBinary(int[] nums,int start,int end)
{
int length = nums.length;
if(nums[start] < nums[end])
return start;
while(nums[start] >= nums[end])
{
if(start + 1 == end)
return end;
int mid = (start + end) / 2;
if(nums[mid] >= nums[start])
start = mid;
else if(nums[mid] <= nums[end])
end = mid;
}
return end;
}
public int binary(int[] nums,int start,int end,int target)
{
if(start <= end)
{
int mid = (start + end) / 2;
if(nums[mid] == target)
return mid;
if(nums[mid] < target)
return binary(nums,mid + 1,end,target);
else if(nums[mid] > target)
return binary(nums,start,mid - 1,target);
}
return -1;
}
相关文章推荐
- Android 5.0新控件——FloatingActionButton(悬浮按钮)
- NSURLConnection基本使用
- 在Android中通过WebView调用相机拍照/选择文件
- unity生成android release 版本的apk性能比较好
- Android 5.0新控件——FloatingActionButton(悬浮按钮)
- android使用小结(上)----2015
- ssh 免密码
- 解决Tomcat 双击闪退问题
- PHP调试环境搭建:wampserver2.4+zend studio12.0.1+Xdebug
- windows下Emacs的安装与配置
- 错题集
- 关于网上商城开发的随笔记录4
- hdu 1494(DP)
- 关于hashCode方法的作用
- 这 9 个关键字,妹子和你聊聊 2015 年的大数据
- MySQL工具汇总
- jackson 与复杂对象的json转换
- [leetcode] 75. Sort Colors 解题报告
- apicloud打包html5的apk所遇错误(org.apache.subversion.javahl.ClientException:)
- Hibernate学习(四)