LeetCode集錦(十一) -第35題 Search Insert Positio

LeetCode集錦(十一) -第35題 Search Insert Position

問題

Given a sorted array and a target value, return the index if the target is found. If not, return the index where it would be if it were inserted in order. 

 You may assume no duplicates in the array. 

 Example 1: 


Input: [1,3,5,6], 5
Output: 2


 Example 2: 


Input: [1,3,5,6], 2
Output: 1


 Example 3: 


Input: [1,3,5,6], 7
Output: 4


 Example 4: 


Input: [1,3,5,6], 0
Output: 0

複製代碼

翻譯:

給定一個排序數組和一個目標值,若是找到目標,返回索引。若是沒有,返回按順序插入的索引所在的位置。
您能夠假定數組中沒有重複項。
示例1:
輸入:一、三、五、6,5
輸出:2
示例2:
輸入:(一、三、五、6),2
輸出:1
示例3:
輸入:1,3,5,6,7
輸出:4
示例4:
輸入:(一、三、五、6),0
輸出:0數組


解題思路

本題主要是爲了找值,若是和目標值相等,就返回下標,若是沒有找到,則返回離它最近且小於它的值的下標。本題能夠用遍歷解決,也能夠使用二分法處理。bash

解題方法

  1. 第一種解體方法,按照咱們的思路來編輯,代碼以下性能

    if (nums.length < 0) {
            return 0;
        }
    
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] >= target) {
                return i;
            }
        }
        return nums.length;
    複製代碼

    時間複雜度: 該方案用了一層循環,循環度爲n,即T(n)=O(n)優化

    空間複雜度: 該方案並無使用額外度空間去存儲,因此空間複雜度仍是O(1);ui

  2. 第二種解題方法,是使用了二分查找的方式,代碼以下: public int searchInsert(int[] nums, int target) { if (nums.length < 0) { return 0; }spa

    return serch(nums, 0, nums.length, target);
    複製代碼

    }翻譯

    private int serch(int[] nums, int start, int end, int target) {code

    if (start >= end) {
         return start;
     }
    
     int mod = (start + end) / 2;
     if (nums[mod] == target) {
         return mod;
     }
     if (nums[mod] < target) {
         return serch(nums, mod + 1, end, target);
     }
    
     if (nums[mod] > target) {
         return serch(nums, start, mod, target);
     }
     return 0;
    複製代碼

    }排序

    __時間複雜度__:
    該方案用了遞歸二分查找,即T(n)=O(nlogn)
    
    __空間複雜度__:
    該方案並無使用額外度空間去存儲,因此空間複雜度仍是O(1);
    複製代碼
  3. 第三種解題方案是針對與第二種解題優化的,遞歸查找在數據量足夠大的狀況下,性能略差,因此使用循環來解決遞歸。代碼以下:遞歸

    if (nums.length < 0) {
            return 0;
        }
        int index = 0;
        int len = nums.length;
        while (index < len) {
            int mod = (index + len) / 2;
            if (nums[mod] == target) {
                return mod;
            } else if (nums[mod] > target) {
                len = mod;
            } else {
                index = mod + 1;
            }
        }
    
        return index;
    複製代碼

    時間複雜度: 該方案用了遞歸二分查找,即T(n)=O(nlogn)

    空間複雜度: 該方案並無使用額外度空間去存儲,因此空間複雜度仍是O(1);

總結

本題的大體解法如上所訴,可是能夠更改的方式不少,運用循環,二分法來進行對本題的解答。

相關文章
相關標籤/搜索