# 0035. Search Insert Position ###### tags: `Leetcode` `Easy` `Binary Search` Binary Search的方法适合于已经有排过序的array,复杂度O(logN) ## 思路 唯一的小难点在于如果这个数不在array里面,return的值是start还是end,还是需要+-1。不过只需要用一个toy example就可以解决。 ## Code ```c= class Solution { public: int binary_search(vector<int>& nums, int target){ int start = 0; int end = nums.size()-1; while(start<end){ int mid = start + (end-start)/2; if(nums[mid]>target){ end = mid; } else if(nums[mid]<target){ start = mid+1; } else{ return mid; } } return start; } int searchInsert(vector<int>& nums, int target) { if(nums[0]>target){ return 0; } else if(nums[nums.size()-1]<target){ return nums.size(); } int index = binary_search(nums,target); return index; } }; ``` ## Result Runtime: 4 ms, faster than **90.05%** of C++ online submissions for Search Insert Position. Memory Usage: 9.7 MB, less than **71.80%** of C++ online submissions for Search Insert Position. ## Code in Java ```java= class Solution { public int searchInsert(int[] nums, int target) { int len = nums.length; if (nums[0] >= target) return 0; if (nums[len - 1] < target) return len; int left = 0, right = len; while (left < right){ int mid = left + (right - left) / 2; if (nums[mid] < target){ left = mid + 1; }else right = mid; } return left; } } ``` ## 思路 二分查找的思路不难理解,但是边界条件容易出错,比如**循环结束条件中 left 和 right 的关系,更新 left 和 right 位置时要不要加 1 减 1**。 ## Result 执行用时:0 ms, 在所有 Java 提交中击败了100.00% 的用户 内存消耗:37.8 MB, 在所有 Java 提交中击败了96.58%的用户