1. 程式人生 > >第九周演算法分析與設計: Search for a Range

第九周演算法分析與設計: Search for a Range

問題描述:

Given an array of integers 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(logn).
If the target is not found in the array, return [-1, -1].
For example,
Given [5, 7, 7, 8, 8, 10]

and target value 8,
return [3, 4].

問題來自此處

解答思路:
一看到題目要求時間複雜度是O(logn),又是跟查詢相關的,還能想到什麼辦法呢~當然是二分法啦!
我的思路是先找到目標數,然後往目標數的左右分別延伸查詢,定下相同數所在的上下界。

vector<int> searchRange(vector<int>& nums, int target) {
        vector<int> result(2,-1); //初始化為[-1,-1]
        int size = nums.size();
        if
(size == 0){ return result; } int low = 0, high = size - 1, med; while(low <= high){ med = (low + high) / 2; if(nums[med] == target){ int left = find_bound(nums,0,med,target); int right = find_bound(nums,size,med,target); result.clear(); result.push_back(left); result.push_back(right); return
result; } else if(nums[med] < target){ low = med + 1; } else{ high = med - 1; } } return result; } int find_bound(vector<int> nums,int numb,int med,int target){ int res = med; if(numb<=med){ for(int i = med;i >= numb;i--){ if(nums[i] == target) res = i; if(nums[i] < target) break; } } else{ for(int i = med;i < numb;i++){ if(nums[i] == target) res = i; if(nums[i] > target) break; } } return res; }

寫得很煞筆。。我以為執行時間的排名鐵定會被排在最後那批。。結果居然在中間……有毒有毒~