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
  • 相关阅读:
    swoole 安装方法 使用即时聊天
    git的介绍以及简单应用
    curl的应用
    linux下监听和同步代码配置
    mac skim 修改背景色
    php 编译安装的一个 configure 配置
    mac mysql error You must reset your password using ALTER USER statement before executing this statement.
    yii2 控制器里 action 大小写组合造成的路由问题
    warning : json_decode(): option JSON_BIGINT_AS_STRING not implemented in xxx
    redis 自启动脚本
  • 原文地址:https://www.cnblogs.com/CherryTab/p/12197332.html
Copyright © 2011-2022 走看看