zoukankan      html  css  js  c++  java
  • leetcode(33)搜索旋转排序数组

    搜索旋转排序数组

    解题思路:二分查找+二分查找递增分界点

    class Solution {
        public int search(int[] nums, int target) {
            int len = nums.length;
            if(len==0){
                return -1;
            }
            if(len==1){
                return nums[0]==target?0:-1;
            }
            int end  = len - 2;
            int start = 0;
            int mid = 0;
            while(start<=end){
                mid  = (start+end)/2;
                if(nums[mid]>nums[mid+1]){
                    break;
                }else if(nums[mid]>=nums[start]){
                    start = mid + 1;
                }else{
                    end = mid - 1;
                }
            }
            if(start>end){
                end = len - 1;
            }else{
                end = mid;
            }
            if(target==nums[0]){
                return 0;
            }else if(target<nums[0]){
                start = end  + 1;
                end = len - 1;
            }else{
                start = 1;
            }
            while(start<=end){
                mid = (start+end)/2;
                if(nums[mid]==target){
                    return mid;
                }else if(nums[mid]<target){
                    start = mid + 1;
                }else{
                    end = mid - 1;
                }
            }
            return -1;
        }
    }

     第二种方法:

    解题思路:二分法查找+多种情况

    class Solution {
        public int search(int[] nums, int target) {
            int len = nums.length;
            if(len==0){
                return -1;
            }
            int end  = len - 1;
            int start = 1;
            int mid = 0;
            if(target==nums[0]){
                return 0;
            }
            while(start<=end){
                mid = (start+end)/2;
                if(nums[mid]==target){
                    return mid;
                }else if(nums[mid]>nums[0]){
                    if(target>nums[mid]){
                        start = mid + 1;
                    }else if(target<nums[0]){
                        start = mid + 1;
                    }else{
                        end = mid - 1; 
                    }
                    
                }else{
                    if(target<nums[mid]){
                        end = mid - 1;
                    }else if(target>nums[0]){
                        end = mid - 1;
                    }else{
                        start = mid + 1;
                    }
                }
            }
            return -1;
        }
    }

    第三种方法:

    解题思路:二分法查找+合并多种情况

    class Solution {
        public int search(int[] nums, int target) {
            int len = nums.length;
            if(len==0){
                return -1;
            }
            int end  = len - 1;
            int start = 1;
            int mid = 0;
            if(target==nums[0]){
                return 0;
            }
            while(start<=end){
                mid = (start+end)/2;
                if(nums[mid]==target){
                    return mid;
                }else if((nums[mid]>nums[0])^(target>nums[mid])^(target>nums[0])){
                    start = mid + 1;
                }else{
                    end = mid - 1;
                }
            }
            return -1;
        }
    }
  • 相关阅读:
    Centos系统修改时间临时和永久生效
    Oracle数据泵恢复用户数据实例
    Oracle修改用户密码错误次数及解锁用户
    MongoDB的启动与停止
    pip常用命令
    mysql执行拉链表操作
    Python实现人脸识别
    Mysql触发器学习
    WordCount程序
    Java学习--多态
  • 原文地址:https://www.cnblogs.com/erdanyang/p/11203496.html
Copyright © 2011-2022 走看看