標籤:
首線是自己一個比較蠢的方法,可能當時沒怎麼細細的想,大體的思路就是,將vector中元素存放到set中(因為set插入的時候已經排好序了),首先尋找,找不到的話在插入,兵器記下插入位置,指標遞增到那個地方的時候就找到了那個位置。如果第一次找到那個位置的就直接遞增找到那個位置即可,代碼見下,很不優雅:
1 class Solution { 2 public: 3 int searchInsert(vector<int>& nums, int target) { 4 set<int>tmpSet(nums.begin(), nums.end());//因為set已經排好序了,所以用set 5 int i = 0; 6 set<int>::iterator sItor; 7 if((sItor = (tmpSet.find(target))) == tmpSet.end())//不在set中的話,就先插入 8 sItor = tmpSet.insert(target); 9 for(auto itor = tmpSet.begin(); itor != it.first; ++itor){10 i++; 11 return i;12 }13 };
但是其實在網上找了點好的答案,實際上這個就是二分法的一個小小的變形而已:
1 class Solution { 2 public: 3 int searchInsert(vector<int>& nums, int target) { 4 int beg = 0; 5 int end = nums.size() - 1; 6 int mid; 7 while(beg <= end){ 8 mid = (beg + end) >> 1; 9 if(nums[mid] > target)10 end = mid - 1;11 else if(nums[mid] < target)12 beg = mid + 1;13 else14 return mid;15 }16 int sz = nums.size();17 if(end < 0) reutrn 0; //這個地方應該注意,不要搞反了18 if(beg >= sz) reutrn sz;19 return beg; //這一步應該注意,很關鍵21 }22 };
二分法不可小覷,細節還是很多的,仔細看看都能有不要的收穫。其實實際上感覺寫出來不太容易錯的還是上面寫的那種方法。
LeetCode OJ:Search Insert Position(尋找插入位置)