1. 程式人生 > 實用技巧 >2020.7.17 力扣每日

2020.7.17 力扣每日

 1 class Solution {
 2     public int searchInsert(int[] nums, int target) {
 3         int length = nums.length;
 4         int left = 0, right = length - 1, ans = 0;
 5         while (left <= right){
 6             int mid = (left + right) / 2;
 7             if (nums[mid] < target){
 8                 left = mid + 1;
9 ans = left; 10 } 11 else right = mid - 1; 12 } 13 return ans; 14 } 15 }

解題思路:

對於該題要求,顯然可以利用暴力法即順序查詢的方法查詢元素插入位置,但這顯然不是最優解法。此時很容易想到利用二分查詢法,由於該題陣列內可能不存在插入的元素,所以需要略微修改下二分查詢的演算法,搜尋到最後一個小於目標的元素,插入到它的後面,或搜尋到第一個大於等於目標的元素,插入到它的當前位置。此處使用第一種方法,即nums[mid] < target。

注意點:

對於nums[mid] < target的方法,即搜尋最後一個小於目標的元素時,可能整個陣列都大於target,所以ans初始值設定為0

對於nums[mid] >= target的方法,即搜尋第一個大於等於目標的元素,可能整個陣列都小於target,所以ans初始值設定為length

時間複雜度:O(logN)

空間複雜度:O(1)

題後總結:

優:熟練的使用二分查詢解決題目

差:無