/*
* 33.Search in sorted Array
* 2016-4-19 by Mingyang
* 我自己写的代码,开始没有考虑[3,1]取1得情况,所以现在需要额外的加一个部分来
* 判断只有2个数的时候
*/
public static int search1(int[] nums, int target) {
int len = nums.length;
if (len == 0 || nums == null)
return -1;
return searchHelper(nums, target, 0, len - 1);
}
public static int searchHelper(int[] nums, int target, int start, int end) {
if (start > end)
return -1;
int mid = (start + end) / 2;
//这就是多加的部分
if(mid==start||mid==end){
if(nums[start]==target)
return start;
if(nums[end]==target)
return end;
return -1;
}
if (nums[mid] == target) {
return mid;
} else if (nums[mid] > nums[start]) {
if (target >= nums[start] && target <= nums[mid]) {
return searchHelper(nums, target, start, mid - 1);
} else {
return searchHelper(nums, target, mid + 1, end);
}
} else {
if (target >= nums[mid] && target <= nums[end]) {
return searchHelper(nums, target, mid + 1, end);
} else {
return searchHelper(nums, target, start, mid - 1);
}
}
}
/*
* 下面是网上的代码,一样的复杂度,可能更具有延展性
* 如果target比A[mid]值要小------------------------------
* 如果A[mid]右边有序(A[mid]<A[high]) 那么target肯定不在右边(target比右边的都得小),在左边找
* 如果A[mid]左边有序,那么比较target和A[low],如果target比A[low]还要小,
*证明target不在这一区,去右边找;反之,左边找。
* 如果target比A[mid]值要大-------------------------------
* 如果A[mid]左边有序(A[mid]>A[low])
* 那么target肯定不在左边(target比左边的都得大),在右边找 如果A[mid]右边有序
* 那么比较target和A[high],如果target比A[high]还要大,证明target不在这一区,去左边找;反之,右边找。
*/
public int search(int[] A, int target) {
if (A == null || A.length == 0)
return -1;
int low = 0;
int high = A.length - 1;
while (low <= high) { //这里是小于等于哦!!!!!!!!!!!!!----?
int mid = (low + high) / 2;
if (target < A[mid]) {
if (A[mid] < A[high])// right side is sorted
high = mid - 1;// target must in left side
else
if (target < A[low])
// target<A[mid]&&target<A[low]==>means,target cannot be in [low,mid] since this side is sorted
low = mid + 1;
else
high = mid - 1;
} else if (target > A[mid]) {
if (A[low] < A[mid])// left side is sorted
low = mid + 1;// target must in right side
else
if (target > A[high])
// right side is sorted. If target>A[high] means target is not in this side
high = mid - 1;
else
low = mid + 1;
} else
return mid;
}
return -1;
}

33.Search in sorted Array的更多相关文章

  1. Search in Sorted Array,Search in Rotated Sorted Array,Search in Rotated Sorted ArrayII

    一:Search in Sorted Array 二分查找,可有重复元素,返回target所在的位置,只需返回其中一个位置,代码中的查找范围为[low,high),左闭右开,否则容易照成死循环. 代码 ...

  2. [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 ...

  3. [Leetcode][Python]33: Search in Rotated Sorted Array

    # -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 33: Search in Rotated Sorted Arrayhttps ...

  4. [array] leetcode - 33. Search in Rotated Sorted Array - Medium

    leetcode - 33. Search in Rotated Sorted Array - Medium descrition Suppose an array sorted in ascendi ...

  5. LeetCode 33 Search in Rotated Sorted Array [binary search] <c++>

    LeetCode 33 Search in Rotated Sorted Array [binary search] <c++> 给出排序好的一维无重复元素的数组,随机取一个位置断开,把前 ...

  6. 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 ...

  7. 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 ...

  8. 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 ...

  9. [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. ...

随机推荐

  1. Git学习——提交BUG

    git stash 可以把当前工作区的修改存储起来,此时可以查看工作区是干净的.这时可以切换到别的分支去处理BUG.等BUG处理好之后,回到该分支,恢复工作区.通过: git stash list 查 ...

  2. GIMP做成颜色蒙板

    效果图: 原始的美女图片上盖了一层的颜色,这个是想出来的效果,只是用来实践学到的技能,具体的场景还没有确定. 1/首先打开原始的美女图片: 2/然后在添加一张新的图片,作为新的图层添加进来: 这样的话 ...

  3. sql 表连接的3种类型

    内连接  inner join (join) 交叉连接  cross join  笛卡尔积 效率低 外连接  outer join  (left join ,right join ,full join ...

  4. (转)浅谈测试驱动开发(TDD)

    测试驱动开发(TDD)是极限编程的重要特点,它以不断的测试推动代码的开发,既简化了代码,又保证了软件质量.本文从开发人员使用的角度,介绍了 TDD 优势.原理.过程.原则.测试技术.Tips 等方面. ...

  5. C#中何时使用dynamic

    背景:比如说,有一个方法,有很多参数,且有时候只需要其中的某几个参数,有时候需要使用全部,甚至有时候一个都不需要,这时候写一个长长的参数列表一点都不酷,且容易 出错,这时候就需要考虑C#的dynami ...

  6. luogu2569 [SCOI2010]股票交易

    题解看这里 #include <iostream> #include <cstring> #include <cstdio> using namespace std ...

  7. 【LeetCode】Pancake Sorting(煎饼排序)

    这道题是LeetCode里的第969道题. 题目要求: 给定数组 A,我们可以对其进行煎饼翻转:我们选择一些正整数 k <= A.length,然后反转 A 的前 k 个元素的顺序.我们要执行零 ...

  8. “玲珑杯”ACM比赛 Round #19

    A -- A simple math problem Time Limit:2s Memory Limit:128MByte Submissions:1599Solved:270 DESCRIPTIO ...

  9. 【Luogu】P1410子序列(DP)

    题目链接 我DP是真的菜啊啊啊啊啊! f[i][j]表示考虑前i个数,有i-j+1个数组成一个上升子序列,且不以i结尾的尾端最小值. 设a为j个数组成的序列,且以i结尾:b为i-j+1个数组成的序列, ...

  10. bzoj2144 跳跳棋 二分

    [bzoj2144]跳跳棋 Description 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子.我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在a,b,c这三个位 ...