leetcote34. 在排序数组中查找元素的第一个和最后一个位置
生活随笔
收集整理的這篇文章主要介紹了
leetcote34. 在排序数组中查找元素的第一个和最后一个位置
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一:題目
二:上碼(暴力+二分)
// class Solution { // public: // /** // 思路:1.首先這是一個升序的 那么相同的一定是會相連的// */// vector<int> searchRange(vector<int>& nums, int target) {// int flag = 0; // int start = 0;// for(int i = 0; i < nums.size(); i++) { // if (nums[i] == target){ // if(flag == 0) start = i; // flag++; // } // } // if(flag == 0) return {-1,-1};// return {start,start+flag-1}; // } // };class Solution { public:/**思路:1.這里分為3種情況1>當taget比nums的左邊界還小的時候, terget比nums右邊界還大的時候 返回{-1,-1}2>當target在nums中時候 那么我們就需要尋找target的左右邊界尋找右邊界 就是由當我們找到nums[mid] = target的時候 然后由left 不斷逼近taget的右邊界尋找左邊界 就是當我們的nums[mid] = target的時候,然后 由right 不斷逼近target的左邊界3>當target在nums中且不存在的時候 返回{-1,-1}*/vector<int> searchRange(vector<int>& nums, int target) {int leftAns = leftBoder(nums,target);int rightAns = rightBoder(nums,target);//情況一if(rightAns == -2 || leftAns == -2) return {-1,-1};//情況二if(rightAns - leftAns > 1) return {leftAns+1,rightAns-1};//情況三return {-1,-1};}int rightBoder(vector<int>& nums,int target) {int left = 0;int right = nums.size()-1;int rightAns = -2;//num中沒有target的話 做個標記while (left <= right) {int mid = (left + right)/2;if(nums[mid] > target) {right = mid -1;}else{//nums[mid] = target的時候 然后由left 不斷逼近taget的右邊界left = mid + 1;rightAns = left;}}return rightAns;}int leftBoder(vector<int>& nums,int target) {int left = 0;int right = nums.size()-1;int leftAns = -2;//num中沒有target的話 做個標記while (left <= right) {int mid = (left + right)/2;if(nums[mid] < target) {left = mid + 1;}else{//nums[mid] = target的時候,然后 由right 不斷逼近target的左邊界right = mid - 1;leftAns = right;}}return leftAns;}};總結
以上是生活随笔為你收集整理的leetcote34. 在排序数组中查找元素的第一个和最后一个位置的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一条SQL语句的执行过程
- 下一篇: 两步轻松修改电脑默认应用怎样修改电脑默认