1. 程式人生 > >每日一道 LeetCode (10):搜尋插入位置

每日一道 LeetCode (10):搜尋插入位置

![](https://cdn.geekdigging.com/LeetCode/header_logo.png) > 每天 3 分鐘,走上演算法的逆襲之路。 ## 前文合集 [每日一道 LeetCode 前文合集](https://www.geekdigging.com/category/leetcode/) ## 程式碼倉庫 GitHub: https://github.com/meteor1993/LeetCode Gitee: https://gitee.com/inwsy/LeetCode ## 題目:搜尋插入位置 題目來源:https://leetcode-cn.com/problems/search-insert-position/ 給定一個排序陣列和一個目標值,在陣列中找到目標值,並返回其索引。如果目標值不存在於陣列中,返回它將會被按順序插入的位置。 你可以假設陣列中無重複元素。 示例 1: ```shell 輸入: [1,3,5,6], 5 輸出: 2 ``` 示例 2: ```shell 輸入: [1,3,5,6], 2 輸出: 1 ``` 示例 3: ```shell 輸入: [1,3,5,6], 7 輸出: 4 ``` 示例 4: ```shell 輸入: [1,3,5,6], 0 輸出: 0 ``` ## 解題思路:暴力方案 經常看我文章的同學看到這這道題都應該感覺是小意思了,最簡單也是最好想的方案,直接迭代數字,用目標字元進行比較,如果大於等於當前的字元,直接返回當前的位置就好,如果一直都沒達成這個條件,說目標字元是最大的,迴圈結束返回。 感覺說的太抽象了,直接上程式碼比較簡潔: ```java public int searchInsert(int[] nums, int target) { if (nums[nums.length - 1] < target) return nums.length; for (int i = 0; i < nums.length; i++) { if (nums[i] >= target) { return i; } } return 0; } ``` ![](https://cdn.geekdigging.com/LeetCode/010/result_1.png) ## 解題思路:二分法 既然這道題的主要考察的是查詢位置,怎麼能少得了我赫赫有名的「二分法」。 尷尬的是我在做這道題的時候並沒有想到這個演算法,看來還是刷題少,需要多加練習。 二分法的思路就不介紹了吧,這個思路不清楚可以單獨私信我。 直接上程式碼: ```java public int searchInsert_1(int[] nums, int target) { int n = nums.length; int left = 0, right = n - 1, ans = n; while (left <= right) { int mid = ((right - left) >> 1) + left; if (target <= nums[mid]) { ans = mid; right = mid - 1; } else { left = mid + 1; } } return ans; } ``` ![](https://cdn.geekdigging.com/LeetCode/010/result_2.png) 上面這兩種方法雖然得到了相同的執行用時,在大量資料的情況下應該是二分法所使用的耗時更少,畢竟暴力方案在最差的情況下需要每次都把整個陣列遍歷一遍,而相對而言二分法所需要的平均迴圈次數