zoukankan      html  css  js  c++  java
  • 【1】【leetcode-33,81】 搜索旋转排序数组

    (没思路)

    33. 搜索旋转排序数组

    假设按照升序排序的数组在预先未知的某个点上进行了旋转。

    ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。

    搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。

    你可以假设数组中不存在重复的元素。

    你的算法时间复杂度必须是 O(log n) 级别。

    示例 1:

    输入: nums = [4,5,6,7,0,1,2], target = 0
    输出: 4
    

    示例 2:

    输入: nums = [4,5,6,7,0,1,2], target = 3
    输出: -1


    链接:https://www.nowcoder.com/questionTerminal/7cd13986c79d4d3a8d928d490db5d707
    来源:牛客网
    二分查找
    整个旋转数组分为两部分一定有一部分有序,那么通过判断左边还是右边有序分为两种情况。
    然后再判断向左走还是向右走
    public class Solution { 
        public int search(int[] A, int target) { 
            int left = 0,right = A.length-1,middle; 
        while(left<=right){ 
        middle = (right+left)/2; 
        if(target==A[middle]){ 
        return middle; 
        } 
        if(A[middle]<A[A.length-1]){//右边有序 
        if(target>A[middle] && target<=A[A.length-1]){ 
        left = middle+1; 
        }else{ 
        right = middle-1; 
        } 
        }else{//左边有序 
        if(A[0]<=target && target<A[middle]){ 
        right = middle-1; 
        }else{ 
        left = middle+1; 
        } 
        } 
        } 
            return -1; 
        } 
    } 

     

    81. 搜索旋转排序数组 II

    假设按照升序排序的数组在预先未知的某个点上进行了旋转。

    ( 例如,数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] )。

    编写一个函数来判断给定的目标值是否存在于数组中。若存在返回 true,否则返回 false

    示例 1:

    输入: nums = [2,5,6,0,0,1,2], target = 0
    输出: true
    

    示例 2:

    输入: nums = [2,5,6,0,0,1,2], target = 3
    输出: false

    进阶:

    • 这是 搜索旋转排序数组 的延伸题目,本题中的 nums  可能包含重复元素。
    • 这会影响到程序的时间复杂度吗?会有怎样的影响,为什么?

     这道题是结合O(n)与O(logn)。之前的方法,每次砍一刀一定有一边有序,利用这个性质二分,这里如果右侧和中间相等,就将右边的指针左移,直到不相等,然后继续二分查找

    public class Solution {
        public boolean search(int[] A, int target) {
            if(A == null || A.length == 0){
                return false;
            }
            int low = 0;
            int high = A.length-1;
            while(low<high){
                int mid = low + (high-low)/2;
                //左半边有序
                if(A[mid] == target){
                    return true;
                }
                if(A[low]<A[mid]){
                    //最左边的肯定是最小值
                    if(A[low] <=target && A[mid] >=target){
                        //肯定在左半边
                        high = mid;
                    }else{
                        low = mid;
                    }
                }else if (A[low]>A[mid]){
                    //左半边不一定有序,那么右半边一定是有序的
                    if(A[mid]<= target && A[high] >= target ){
                        low = mid;
                    }else{
                        high = mid;
                    }
                }else{
                    low++;
                }
            }
            if(A[low] == target){
                return true;
            }
            if(A[high] == target){
                return true;
            }
            return false;
        }
    }
  • 相关阅读:
    Azure HPC Pack Cluster添加辅助节点
    Azure HPC Pack 辅助节点模板配置
    Azure HPC Pack配置管理系列(PART6)
    Windows HPC Pack 2012 R2配置
    Azure HPC Pack 节点提升成域控制器
    Azure HPC Pack VM 节点创建和配置
    Azure HPC Pack 部署必要条件准备
    Azure HPC Pack 基础拓扑概述
    Azure VM 性能计数器配置
    Maven私仓配置
  • 原文地址:https://www.cnblogs.com/twoheads/p/10609425.html
Copyright © 2011-2022 走看看