2024-03-29 代碼隨想錄

代碼隨想錄算法訓練營day24 | 題目77、題目35


題目一描述

77. 組合

給定兩個整數(shù) n 和 k,返回范圍 [1, n] 中所有可能的 k 個數(shù)的組合。
你可以按 任何順序 返回答案。

示例 1:
輸入:n = 4, k = 2
輸出:
[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
]

示例 2:
輸入:n = 1, k = 1
輸出:[[1]]

提示:

1 <= n <= 20
1 <= k <= n

解題思路

理解并背下來回溯的模板,與之前的path回溯很接近。

def backtrack(...):
    for 選擇 in 選擇列表:
        做選擇
        backtrack(...)
        撤銷選擇

注意剪枝的操作,一般是在for循環(huán)做這個。

代碼實現(xiàn)

方法一:

class Solution {
    List<List<Integer>> res = new ArrayList<>();
    List<Integer> path = new ArrayList<>();

    public List<List<Integer>> combine(int n, int k) {
        backtrack(1, n, k);
        return res;
    }

    private void backtrack(int startIndex, int n, int k) {
        if (path.size() == k) {
            res.add(new ArrayList<>(path));
            return;
        }
        // 一共需要的元素 k 個
        // 當前已經(jīng)選擇的元素 path.size()個, 不要用startIndex來表示這個量,因為每次size都會變
        // startIndex 目前要選擇的第一個元素
        // n - (k - path.size()) + 1 代表i能取到的最大的元素,比如 n = 4, k = 3, size = 0
        // 由于要取3個數(shù),i范圍是從1到2,從3開始取沒有意義了。
        for (int i = startIndex; i <= n - (k - path.size()) + 1; i++) {
            path.add(i);
            backtrack(i + 1, n, k);
            path.remove(path.size() - 1);
        }
    }
}

題目二描述

35. 搜索插入位置

給定一個排序數(shù)組和一個目標值,在數(shù)組中找到目標值,并返回其索引。如果目標值不存在于數(shù)組中,返回它將會被按順序插入的位置。

請必須使用時間復雜度為 O(log n) 的算法。

示例 1:
輸入: nums = [1,3,5,6], target = 5
輸出: 2

示例 2:
輸入: nums = [1,3,5,6], target = 2
輸出: 1

示例 3:
輸入: nums = [1,3,5,6], target = 7
輸出: 4

提示:
1 <= nums.length <= 10^4
-10^4 <= nums[i] <= 10^4
nums 為 無重復元素 的 升序 排列數(shù)組
-10^4 <= target <= 10^4

解題思路

在一般的二分查找中,如果沒有找到元素,終止條件之后left一定等于right+1,而left的位置一定就是這個元素要插入的位置。

代碼實現(xiàn)

方法一:

class Solution {
    public int searchInsert(int[] nums, int target) {
        int left = 0;
        int right = nums.length - 1;
        while (left <= right) {
            int mid = left + (right - left) / 2;
            if (nums[mid] == target) {
                return mid;
            } else if (nums[mid] < target) {
                left = mid + 1;
            } else if (nums[mid] > target) {
                right = mid - 1;
            }
        }
        return left;
        // return right + 1;
    }
}

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容