给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 O(log n) 的算法。
二分练习,感觉自己对二分的边界处理不太行,纯靠感觉
思路就特判首尾,然后二分找到可以放下数字的位置或者找到数字。一开始l=mid+1那里没处理好,会跳数字,改成l=mid和r=mid就过了
class Solution { public: int searchInsert(vector<int>& nums, int target) { int r=nums.size()-1,l=0,mid; if(target>nums[r])return r+1; else if(target==nums[r])return r; else if(target==nums[l])return 0; else if(target<nums[l])return 0; while(l<=r){ mid=(l+r)>>1; if(target==nums[mid])return mid; else if(target>nums[mid]&&target<nums[mid+1]){ mid++;break; } else if(target<nums[mid]&&target>nums[mid-1]){ break; } else if (target>nums[mid])l=mid; else if (target<nums[mid])r=mid; } return mid ; } };
(代码随想录 (programmercarl.com) 关于边界处理)
下面放标准代码,看完以后觉得自己连二分都学的稀烂