zoukankan      html  css  js  c++  java
  • LeetCode-34.Find First and Last Position of Element in Sorted Array

    Given an array of integers nums sorted in ascending order, find the starting and ending position of a given target value.

    Your algorithm's runtime complexity must be in the order of O(log n).

    If the target is not found in the array, return [-1, -1].

    Example 1:

    Input: nums = [5,7,7,8,8,10], target = 8
    Output: [3,4]

    Example 2:

    Input: nums = [5,7,7,8,8,10], target = 6
    Output: [-1,-1]

    二分查找的变形 ,时间复杂度O(lgn)

        public int[] searchRange(int[] nums, int target) {//二分 my
            int[] re = new int[2];
            re[0] = bSearchFirst(nums,target);
            re[1] = bSearchLast(nums,target);
            return re;
        }
        
        private int bSearchFirst(int[] nums,int target){
            if(null==nums||0==nums.length){
                return -1;
            }
            int left = 0;
            int right = nums.length-1;
            while(left<= right){
                int mid = (left+right)/2;
                if(nums[mid] >target){
                    right = mid-1;
                }
                else if(nums[mid]<target) {
                    left = mid+1;
                }
                else if((mid==0)||(nums[mid-1]!=target)){//如果nums[mid]=target,而且是第一个
                        return mid;
                }
                else{//如果nums[mid]=target,而且不是第一个
                    right = mid-1;
                } 
            }
            return -1;
        }
        private int bSearchLast(int[] nums,int target){
            if(null==nums||0==nums.length){
                return -1;
            }
            int left = 0;
            int right = nums.length-1;
            while(left<= right){
                int mid = (left+right)/2;
                if(nums[mid] >target){
                    right = mid-1;
                }
                else if(nums[mid]<target){
                    left = mid+1;
                }
                else if((mid==nums.length-1)||(nums[mid+1]!=target)){//如果nums[mid]=target,而且是最后一个
                        return mid;
                }
                else {//如果nums[mid]=target,而且是最后一个
                    left = mid+1;
                }
            }
            return -1;
        }
  • 相关阅读:
    在CentOS-6.3环境下,利用grub工具手工制作Linux U盘安装盘
    Windowns DOS For 循环实例
    Bootstrap 标签的变体 实例样式
    Bootstrap两端对齐的导航实例
    bootstrap 分页样式代码
    C# 微信扫码支付API (微信扫码支付模式二)
    AjaxFileUpload 在C#中应用
    关于百度编辑器UEditor(1.4.3)在C#.NET中的应用实例
    电脑运行状态
    网络测试
  • 原文地址:https://www.cnblogs.com/zhacai/p/11023279.html
Copyright © 2011-2022 走看看