• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
我就是UTD的码农包
博客园    首页    新随笔    联系   管理    订阅  订阅
【lintcode】二分法总结 II

Half and Half 类型题

二分法的精髓在于判断目标值在前半区间还是后半区间,Half and Half类型难点在不能一次判断,可能需要一次以上的判断条件。

 

Maximum Number in Mountain Sequence 

Given a mountain sequence of n integers which increase firstly and then decrease, find the mountain top.

样例  Given nums = [1, 2, 4, 8, 6, 3] return 8   Given nums = [10, 9, 8, 7], return 10
public int mountainSequence(int[] nums) {
        // write your code here
        if(nums == null || nums.length == 0){
            return -1;
        }
        int start = 0;
        int end = nums.length - 1;
        while(start + 1 < end){
            int mid = start + (end - start)/2;
            if(nums[start] < nums[mid]){
                if(nums[mid+1]<nums[mid]){
                    end = mid;
                }
                else{
                    start = mid;
                }
                
            }
            else{
                if(nums[mid-1]<nums[mid]){
                    start = mid;
                }
                else{
                    end = mid;
                }
                
            }
        }
        if(nums[start] > nums[end]){
            return nums[start];
        }
        else{
            return nums[end];
        }
        //return -1;
    }

假设有一个排序的按未知的旋转轴旋转的数组(比如,0 1 2 4 5 6 7 可能成为4 5 6 7 0 1 2)。给定一个目标值进行搜索,如果在数组中找到目标值返回数组中的索引位置,否则返回-1。你可以假设数组中不存在重复的元素。

样例

给出[4, 5, 1, 2, 3]和target=1,返回 2

给出[4, 5, 1, 2, 3]和target=0,返回 -1

思路:判断目标值是否在某一区间/跨区间,再比较目标值

public int search(int[] A, int target) {
        // write your code here
        if(A == null | A.length == 0){
            return -1;
        }
        int start = 0;
        int end = A.length - 1;
        while(start + 1 < end){
            int mid = start + (end - start)/2;
            if (A[start] < A[mid]){
                if(target >= A[start] && target <= A[mid]){
                    end = mid;
                }
                else{
                    start = mid;
                }
                    
            }
            else{
                if(target >= A[mid] && target <= A[end]){
                    start = mid;
                }
                else{
                    end = mid;
                }
            }
        }
        if(A[start] == target){
            return start;
        }
        if(A[end] == target){
            return end;
        }
        return -1;
    }

 

 
I just want to live when I am alive.
posted on 2017-10-16 06:05  UTD的码农包  阅读(215)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3