首线是自己一个比较蠢的方法,可能当时没怎么细细的想,大体的思路就是,将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 else 14 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 };
二分法不可小觑,细节还是很多的,仔细看看都能有不要的收获。其实实际上感觉写出来不太容易错的还是上面写的那种方法。
时间: 2024-10-24 12:08:32