国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

LeetCode 41 缺失的第一個正數(shù)

這篇具有很好參考價值的文章主要介紹了LeetCode 41 缺失的第一個正數(shù)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

題目描述

缺失的第一個正數(shù)

給你一個未排序的整數(shù)數(shù)組 nums ,請你找出其中沒有出現(xiàn)的最小的正整數(shù)。

請你實現(xiàn)時間復雜度為 O(n) 并且只使用常數(shù)級別額外空間的解決方案。

示例 1:

輸入:nums = [1,2,0]
輸出:3

示例 2:

輸入:nums = [3,4,-1,1]
輸出:2

示例 3:

輸入:nums = [7,8,9,11,12]
輸出:1

提示:

  • 1 <= nums.length <= 5 * 105
  • -231 <= nums[i] <= 231 - 1

解法

如果本題沒有額外的時空復雜度要求,那么就很容易實現(xiàn):

  • 我們可以將數(shù)組所有的數(shù)放入哈希表,隨后從 111 開始依次枚舉正整數(shù),并判斷其是否在哈希表中;
  • 我們可以從 111 開始依次枚舉正整數(shù),并遍歷數(shù)組,判斷其是否在數(shù)組中。

如果數(shù)組的長度為 N,那么第一種做法的時間復雜度為 O(N),空間復雜度為 O(N);第二種做法的時間復雜度為 O(N^2),空間復雜度為 O(1)。但它們都不滿足時間復雜度為 O(N) 且空間復雜度為 O(1)。

但是我們可以利用給定數(shù)組中的空間來存儲一些狀態(tài)。也就是說,如果題目給定的數(shù)組是不可修改的,那么就不存在滿足時空復雜度要求的算法;但如果我們可以修改給定的數(shù)組,那么是存在滿足要求的算法的。

對于上面中提到的第一種做法:

我們可以將數(shù)組所有的數(shù)放入哈希表,隨后從 111 開始依次枚舉正整數(shù),并判斷其是否在哈希表中。

仔細想一想,我們?yōu)槭裁匆褂霉1??這是因為哈希表是一個可以支持快速查找的數(shù)據(jù)結(jié)構(gòu):給定一個元素,我們可以在 O(1)的時間查找該元素是否在哈希表中。因此,我們可以考慮將給定的數(shù)組設(shè)計成哈希表的「替代產(chǎn)品」。

**實際上,對于一個長度為 N 的數(shù)組,其中沒有出現(xiàn)的最小正整數(shù)只能在 [1,N+1] 中。**這是因為如果 [1, N] 都出現(xiàn)了,那么答案是 N+1,否則答案是 [1,N] 中沒有出現(xiàn)的最小正整數(shù)。

這樣一來,我們將所有在 [1, N]范圍內(nèi)的數(shù)放入哈希表,也可以得到最終的答案。而給定的數(shù)組恰好長度為 N,這讓我們有了一種將數(shù)組設(shè)計成哈希表的思路:

我們對數(shù)組進行遍歷,對于遍歷到的數(shù) x,如果它在[1,N] 的范圍內(nèi),那么就將數(shù)組中的第 x?1個位置(注意:數(shù)組下標從 0開始)打上「標記」。在遍歷結(jié)束之后,如果所有的位置都被打上了標記,那么答案是 N+1,否則答案是最小的沒有打上標記的位置加 1。

那么如何設(shè)計這個「標記」呢?由于數(shù)組中的數(shù)沒有任何限制,因此這并不是一件容易的事情。但我們可以繼續(xù)利用上面的提到的性質(zhì):由于我們只在意 [1, N] 中的數(shù),因此我們可以先對數(shù)組進行遍歷,把不在 [1, N] 范圍內(nèi)的數(shù)修改成任意一個大于 N 的數(shù)(例如 N+1)。這樣一來,數(shù)組中的所有數(shù)就都是正數(shù)了,因此我們就可以將「標記」表示為「負號」。算法的流程如下:

  • 我們將數(shù)組中所有小于等于 0 的數(shù)修改為 N+1;
  • 我們遍歷數(shù)組中的每一個數(shù) x,它可能已經(jīng)被打了標記,因此原本對應(yīng)的數(shù)為 |x|,其中 | | 為絕對值符號。如果 ∣x∣∈[1,N],那么我們給數(shù)組中的第 |x| - 1 個位置的數(shù)添加一個負號。注意如果它已經(jīng)有負號,不需要重復添加;
  • 在遍歷完成之后,如果數(shù)組中的每一個數(shù)都是負數(shù),那么答案是 N+1,否則答案是第一個正數(shù)的位置加 1。

LeetCode 41 缺失的第一個正數(shù),# leetcode,leetcode,算法,數(shù)據(jù)結(jié)構(gòu)

java代碼:

class Solution {
    public int firstMissingPositive(int[] nums) {
        int n = nums.length;
        // 將負數(shù)變?yōu)閚 + 1
        for (int i = 0; i < n; i++) {
            if (nums[i] <= 0) {
                nums[i] = n + 1;
            }
        }
        // 將元素<=n對應(yīng)的位置變?yōu)樨摂?shù),表示在該位置的元素在1 ~ n范圍內(nèi)
        for (int i = 0; i < n; i++) {
            int num = Math.abs(nums[i]);
            if (num <=  n) {
                // 注意由于有相同的元素,有可能原來nums[num - 1]的元素由正數(shù)變負數(shù),然后又變?yōu)檎龜?shù),所以使用絕對值的負數(shù)
                nums[num - 1] = - Math.abs(nums[num - 1]);
            }
        }
        // 返回第一個大于0的元素下標 + 1
        for (int i = 0; i < n; ++i) {
            if (nums[i] > 0) {
                return i + 1;
            }
        }
        return n + 1;
    }
}

復雜度文章來源地址http://www.zghlxwxcb.cn/news/detail-798180.html

  • 時間復雜度:O(N),其中 N 為數(shù)組的長度
  • 空間復雜度:O(1)

到了這里,關(guān)于LeetCode 41 缺失的第一個正數(shù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 【leetcode】缺失的第一個正數(shù) hashmap

    【leetcode】缺失的第一個正數(shù) hashmap

    先把數(shù)組里面的正數(shù)i都取出來,放到對應(yīng)的arr[i]=1 然后遍歷arr,如果不為1,那么就返回i

    2024年01月19日
    瀏覽(11)
  • 41. 缺失的第一個正數(shù) --力扣 --JAVA

    給你一個未排序的整數(shù)數(shù)組 nums ,請你找出其中沒有出現(xiàn)的最小的正整數(shù)。 請你實現(xiàn)時間復雜度為 O(n) 并且只使用常數(shù)級別額外空間的解決方案。 對數(shù)組進行排序,便于查看是否連續(xù); 因為是最小正整數(shù),所以判斷值應(yīng)從1開始; 只要當前元素值大于最小值,則直接返回最

    2024年02月06日
    瀏覽(82)
  • 力扣數(shù)組類題目--41缺失的第一個正數(shù)

    力扣數(shù)組類題目--41缺失的第一個正數(shù)

    41 缺失的第一個正數(shù) 給你一個未排序的整數(shù)數(shù)組 nums ,請你找出其中沒有出現(xiàn)的最小的正整數(shù)。 請你實現(xiàn)時間復雜度為 O(n) 并且只使用常數(shù)級別額外空間的解決方案 。 示例 1: 輸入:nums = [1,2,0] 輸出:3 示例 2: 輸入:nums = [3,4,-1,1] 輸出:2 示例 3: 輸入:nums = [7,8,9,11,12

    2024年02月11日
    瀏覽(24)
  • Practices11|41. 缺失的第一個正數(shù)(數(shù)組)、73. 矩陣置零(矩陣)

    Practices11|41. 缺失的第一個正數(shù)(數(shù)組)、73. 矩陣置零(矩陣)

    1.題目: 給你一個未排序的整數(shù)數(shù)組? nums ?,請你找出其中沒有出現(xiàn)的最小的正整數(shù)。 請你實現(xiàn)時間復雜度為? O(n) ?并且只使用常數(shù)級別額外空間的解決方案。 示例 1: 示例 2: 示例 3: 提示: 1 = nums.length = 5 * 105 -231 = nums[i] = 231 - 1 2.思路: 如果本題沒有額外的時空復雜

    2024年02月12日
    瀏覽(21)
  • 算法---缺失的第一個正數(shù)

    算法---缺失的第一個正數(shù)

    給你一個未排序的整數(shù)數(shù)組 nums ,請你找出其中沒有出現(xiàn)的最小的正整數(shù)。 借用map 就可以實現(xiàn),但是如果不借用map,在原空間上,也可以實現(xiàn),不過想要使用原來的數(shù)據(jù),會有侵略性,會把原來的數(shù)據(jù)修改掉。 方法一: 方法二: 算法是很看一個人的思維邏輯的,所以很多

    2024年02月06日
    瀏覽(17)
  • 數(shù)據(jù)結(jié)構(gòu)與算法之堆: Leetcode 215. 數(shù)組中的第K個最大元素 (Typescript版)

    數(shù)組中的第K個最大元素 https://leetcode.cn/problems/kth-largest-element-in-an-array/ 描述 給定整數(shù)數(shù)組 nums 和整數(shù) k,請返回數(shù)組中第 k 個最大的元素。 請注意,你需要找的是數(shù)組排序后的第 k 個最大的元素,而不是第 k 個不同的元素。 你必須設(shè)計并實現(xiàn)時間復雜度為 O(n) 的算法解決此

    2024年02月07日
    瀏覽(42)
  • LeetCode 34 在排序數(shù)組中查找元素的第一個和最后一個位置

    在排序數(shù)組中查找元素的第一個和最后一個位置 給你一個按照非遞減順序排列的整數(shù)數(shù)組 nums ,和一個目標值 target 。請你找出給定目標值在數(shù)組中的開始位置和結(jié)束位置。 如果數(shù)組中不存在目標值 target ,返回 [-1, -1] 。 你必須設(shè)計并實現(xiàn)時間復雜度為 O(log n) 的算法解決此

    2024年02月02日
    瀏覽(25)
  • 【LeetCode】917. 僅僅反轉(zhuǎn)字母、387. 字符串中的第一個唯一字符

    【LeetCode】917. 僅僅反轉(zhuǎn)字母、387. 字符串中的第一個唯一字符

    ?作者:小盧 ? 專欄:《Leetcode》 喜歡的話:世間因為少年的挺身而出,而更加瑰麗。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ——《人民日報》 目錄 ?917. 僅僅反轉(zhuǎn)字母 ?387. 字符串中的第一個唯一字符 917. 僅僅反轉(zhuǎn)字母? 題目描述: 給你一個字符串? s ?,根據(jù)下述規(guī)則反轉(zhuǎn)

    2023年04月12日
    瀏覽(29)
  • (鏈表) 劍指 Offer 52. 兩個鏈表的第一個公共節(jié)點 ——【Leetcode每日一題】

    (鏈表) 劍指 Offer 52. 兩個鏈表的第一個公共節(jié)點 ——【Leetcode每日一題】

    難度:簡單 輸入兩個鏈表,找出它們的第一個公共節(jié)點。 如下面的兩個鏈表: 在節(jié)點 c1 開始相交。 示例 1: 輸入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3 輸出:Reference of the node with value = 8 輸入解釋:相交節(jié)點的值為 8 (注意,如果兩個列表相交則

    2024年02月15日
    瀏覽(27)
  • 算法訓練day41|動態(tài)規(guī)劃 part03(LeetCode343. 整數(shù)拆分、96.不同的二叉搜索樹)

    算法訓練day41|動態(tài)規(guī)劃 part03(LeetCode343. 整數(shù)拆分、96.不同的二叉搜索樹)

    題目鏈接???? 給定一個正整數(shù) n,將其拆分為至少兩個正整數(shù)的和,并使這些整數(shù)的乘積最大化。 返回你可以獲得的最大乘積。 示例 1: 輸入: 2 輸出: 1 解釋: 2 = 1 + 1, 1 × 1 = 1。 示例 2: 輸入: 10 輸出: 36 解釋: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。 說明: 你可以假設(shè) n 不小于 2 且不大于

    2024年02月10日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包