• (二分查找 拓展) leetcode 34. Find First and Last Position of Element in Sorted Array && lintcode 61. Search for a Range


    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]
    ------------------------------------------------------------------------------------
    这个题是在leetcode和lintcode 上都有的,只不过题目里面给的参数有些是不同的,需要注意的,不过代码是基本相同的。
    用遍历数组的方式可能会TLE,所以用二分更好。
    emmm,二分查找也可以用递归方式来写的。当用二分查找方式得到一个不为-1数组下标时,向两边扩展,最终得到一个范围。
    C++代码:
    class Solution {
    public:
        vector<int> searchRange(vector<int>& nums, int target) {
            int ans = search(nums,0,nums.size()-1,target);
            if(ans == -1) return {-1,-1};  //归结根底,vector就是一个数组,可以用{}。
            int left = ans,right = ans;
            while(left > 0 && nums[left-1] == nums[ans]) left--;
            while(right < nums.size() - 1 && nums[right+1] == nums[ans]) right++;
            return {left,right};
        }
        int search(vector<int>& nums,int left,int right,int target){
            if(left > right) return -1;
            int mid = left + (right - left)/2;
            if(nums[mid] == target) return mid;
            if(nums[mid] > target) return search(nums,0,mid-1,target);
            else return search(nums,mid+1,right,target);
        }
    };

    还有一个解法:

    class Solution {
    public:
        vector<int> searchRange(vector<int>& nums, int target) {
            int ans = search(nums,0,nums.size()-1,target);
            if(ans == -1) return {-1,-1};
            int left = ans,right = ans;
            while(left > 0 && nums[left-1] == nums[ans]) left--;
            while(right < nums.size() - 1 && nums[right+1] == nums[ans]) right++;
            return {left,right};
        }
        int search(vector<int>& nums,int left,int right,int target){
            // if(left > right) return -1;
            // int mid = left + (right - left)/2;
            // if(nums[mid] == target) return mid;
            // if(nums[mid] > target) return search(nums,0,mid-1,target);
            // else return search(nums,mid+1,right,target);
            if(nums.size() == 0) return -1;
            while(left + 1 < right){
                int mid = left + (right - left)/2;
                if(nums[mid] > target) right = mid;
                else if(nums[mid] < target) left = mid;
                else return mid;
            }
            if(nums[left] == target) return left;
            if(nums[right] == target) return right;
            return -1;
        }
    };

    emmm,也可以看官方题解:https://leetcode.com/articles/find-first-and-last-position-element-sorted-array/

  • 相关阅读:
    线性结构2 一元多项式的乘法与加法运算 【STL】
    Maximum Subsequence Sum 【DP】
    第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛 L 用来作弊的药水 【快速幂】
    第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛 A 跳台阶【DP】
    Wannafly挑战赛12 B T95要减肥 【贪心】
    表达式转换 【模拟】
    Wannafly挑战赛12 A 银行存款 【DP】【DFS】
    PAT 天梯赛 L3-008. 喊山 【BFS】
    PAT 天梯赛 L3-003. 社交集群 【并查集】
    装箱问题【STL】
  • 原文地址:https://www.cnblogs.com/Weixu-Liu/p/10757970.html
Copyright © 2020-2023  润新知