zoukankan      html  css  js  c++  java
  • leetcode-34

    给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。

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

    如果数组中不存在目标值,返回 [-1, -1]。

    示例 1:

    输入: nums = [5,7,7,8,8,10], target = 8
    输出: [3,4]
    示例 2:

    输入: nums = [5,7,7,8,8,10], target = 6
    输出: [-1,-1]

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    class Solution {
        // returns leftmost (or rightmost) index at which `target` should be
        // inserted in sorted array `nums` via binary search.
        private int extremeInsertionIndex(int[] nums, int target, boolean left) {
            int lo = 0;
            int hi = nums.length;
    
            while (lo < hi) {
                int mid = (lo + hi) / 2;
                if (nums[mid] > target || (left && target == nums[mid])) {
                    hi = mid;
                }
                else {
                    lo = mid+1;
                }
            }
    
            return lo;
        }
    
        public int[] searchRange(int[] nums, int target) {
            int[] targetRange = {-1, -1};
    
            int leftIdx = extremeInsertionIndex(nums, target, true);
    
            // assert that `leftIdx` is within the array bounds and that `target`
            // is actually in `nums`.
            if (leftIdx == nums.length || nums[leftIdx] != target) {
                return targetRange;
            }
    
            targetRange[0] = leftIdx;
            targetRange[1] = extremeInsertionIndex(nums, target, false)-1;
    
            return targetRange;
        }
    }
    class Solution {
        public int[] searchRange(int[] nums, int target) {
            int[] targetRange = {-1, -1};
    
            // find the index of the leftmost appearance of `target`.
            for (int i = 0; i < nums.length; i++) {
                if (nums[i] == target) {
                    targetRange[0] = i;
                    break;
                }
            }
    
            // if the last loop did not find any index, then there is no valid range
            // and we return [-1, -1].
            if (targetRange[0] == -1) {
                return targetRange;
            }
    
            // find the index of the rightmost appearance of `target` (by reverse
            // iteration). it is guaranteed to appear.
            for (int j = nums.length-1; j >= 0; j--) {
                if (nums[j] == target) {
                    targetRange[1] = j;
                    break;
                }
            }
    
            return targetRange;
        }
    }

    end

    一个没有高级趣味的人。 email:hushui502@gmail.com
  • 相关阅读:
    第二阶段冲刺(三)
    第二阶段冲刺(二)
    第二阶段冲刺(一)
    阿里云体验:安装jdk
    知识储备
    wcf服务编程(二)
    wcf服务编程(一)
    操作xml练习
    操作文件简单的方法
    【mongoDB】学习笔记_02
  • 原文地址:https://www.cnblogs.com/CherryTab/p/12197332.html
Copyright © 2011-2022 走看看