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

代碼隨想錄Day02:977.有序數(shù)組的平方 ,209.長度最小的子數(shù)組 ,59.螺旋矩陣II

這篇具有很好參考價(jià)值的文章主要介紹了代碼隨想錄Day02:977.有序數(shù)組的平方 ,209.長度最小的子數(shù)組 ,59.螺旋矩陣II。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

Day02:977.有序數(shù)組的平方 ,209.長度最小的子數(shù)組 ,59.螺旋矩陣II

977.有序數(shù)組的平方

題目建議】: 本題關(guān)鍵在于理解雙指針?biāo)枷?/p>

【隨想錄文章講解】

【卡哥視頻講解】

方法一:暴力排序法

**思路:**先對數(shù)組中每個(gè)數(shù)進(jìn)行平方運(yùn)算,然后再排序

class Solution {
public:
    vector<int> sortedSquares(vector<int>& A) {  
        for (int i = 0; i < A.size(); i++) {		//先計(jì)算出平方后的數(shù)組
            A[i] *= A[i];
        }
        sort(A.begin(), A.end()); // 快速排序  
        return A;
    }
};
  • 時(shí)間復(fù)雜度是 O(n + nlogn) 其中包括計(jì)算平方數(shù)組的O(n)和快速排序的O(nlogn),總體上是O(nlogn)
  • 空間復(fù)雜度:O(logn)。除了存儲答案的數(shù)組以外,需要 O(logn) 的??臻g進(jìn)行排序。
方法二:雙指針法

思路:原始數(shù)組是有序的數(shù)組,那么平方后數(shù)組中最大的值在兩端(不是在最左面就是最右面),這種情形考慮雙指針法,i指向起始位置,j指向終止位置。

定義一個(gè)新數(shù)組result,和A數(shù)組一樣的大小,讓k指向result數(shù)組終止位置。讓大的數(shù)逐漸進(jìn)入result的隊(duì)尾。

class Solution {
public:
    vector<int> sortedSquares(vector<int>& A) {
        int k = A.size()-1;						//這里定義k,后面讓k指向result的尾部
        vector<int> result(A.size(),0);			//新知識:定義一個(gè)數(shù)組寫法
        for(int i=0,j=A.size()-1;i<=j;){		// 循環(huán)終止條件,這里一定注意邊界問題<=不然會出現(xiàn)漏掉元素的問題
            if(A[i]*A[i]<A[j]*A[j]){			//比較頭部數(shù)據(jù)大還是尾部數(shù)據(jù)大
                result[k--]=A[j]*A[j];			//尾部數(shù)據(jù)大,進(jìn)入result尾部
                j--;						
            }
            else{
                result[k--]=A[i]*A[i];			//頭部數(shù)據(jù)大,進(jìn)入result尾部
                i++;
            }

        }
               return result;					//輸出這個(gè)數(shù)組
    }
};

  • 時(shí)間復(fù)雜度為O(n)
  • 空間復(fù)雜度:O(1)
209.長度最小的子數(shù)組

題目建議: 本題關(guān)鍵在于理解滑動窗口,這個(gè)滑動窗口看文字講解 還挺難理解的,建議先看視頻講解。 拓展題目二刷做。

【題目鏈接】

【隨想錄文章講解】

【卡哥視頻講解】

相關(guān)題目推薦

  • 904.水果成籃

  • 76.最小覆蓋子串

方法一:暴力解法

**思路:**暴力解法當(dāng)然是 兩個(gè)for循環(huán),然后不斷的尋找符合條件的子序列,時(shí)間復(fù)雜度很明顯是O(n^2)。

#include <iostream>         // 包含頭文件。
#include<vector>
using namespace std;        // 指定缺省的命名空間。

int minSubArrayLen(int s, vector<int>& nums) {
    int result = INT32_MAX; // 最終的結(jié)果
    int sum = 0; // 子序列的數(shù)值之和
    int subLength = 0; // 子序列的長度
    for (int i = 0; i < nums.size(); i++) { // 設(shè)置子序列起點(diǎn)為i
        sum = 0;
        for (int j = i; j < nums.size(); j++) { // 設(shè)置子序列終止位置為j
            sum += nums[j];
            if (sum >= s) { // 一旦發(fā)現(xiàn)子序列和超過了s,更新result
                subLength = j - i + 1; // 取子序列的長度
                result = result < subLength ? result : subLength;
                break; // 因?yàn)槲覀兪钦曳蠗l件最短的子序列,所以一旦符合條件就break
            }
        }
    }
    // 如果result沒有被賦值的話,就返回0,說明沒有符合條件的子序列
    return result == INT32_MAX ? 0 : result;
}

    int main() {
        vector<int> v{ 2,3,1,2,4,3 };
        cout << minSubArrayLen(7, v);

}
  • 時(shí)間復(fù)雜度:O(n^2)
  • 空間復(fù)雜度:O(1)
方法二:滑動窗口(雙指針的思路)

思路不斷的調(diào)節(jié)子序列的起始位置和終止位置,從而得出我們要想的結(jié)果

class Solution {
public:
    int minSubArrayLen(int s, vector<int>& nums) {
        int result = INT32_MAX;//獲取有符號 int 對象的最大值  保證result會更新
        int sum = 0; // 滑動窗口數(shù)值之和
        int i = 0; // 滑動窗口起始位置
        int subLength = 0; // 滑動窗口的長度
        for (int j = 0; j < nums.size(); j++) {
            sum += nums[j];
            // 注意這里使用while,每次更新 i(起始位置),并不斷比較子序列是否符合條件
            while (sum >= s) {
                subLength = (j - i + 1); // 取子序列的長度
                result = result < subLength ? result : subLength;
                sum -= nums[i++]; // 這里體現(xiàn)出滑動窗口的精髓之處,不斷變更i(子序列的起始位置)
            }
        }
        // 如果result沒有被賦值的話,就返回0,說明沒有符合條件的子序列
        return result == INT32_MAX ? 0 : result;
    }
};

  • 時(shí)間復(fù)雜度:O(n)
  • 空間復(fù)雜度:O(1)
59.螺旋矩陣II

題目建議: 本題關(guān)鍵還是在轉(zhuǎn)圈的邏輯,在二分搜索中提到的區(qū)間定義。本題并不涉及到什么算法,就是模擬過程,但卻十分考察對代碼的掌控能力。

【 題目鏈接 】 【 隨想錄文章講解 】 【 卡哥視頻講解 】

思路:關(guān)鍵點(diǎn)是拐角上的點(diǎn),求解本題依然是要堅(jiān)持循環(huán)不變量原則,本題的方法是左閉右開。

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>> res(n, vector<int>(n, 0)); // 使用vector定義一個(gè)二維數(shù)組
        int startx = 0, starty = 0; // 定義每循環(huán)一個(gè)圈的起始位置
        int loop = n / 2; // 每個(gè)圈循環(huán)幾次,例如n為奇數(shù)3,那么loop = 1 只是循環(huán)一圈,矩陣中間的值需要單獨(dú)處理
        int mid = n / 2; // 矩陣中間的位置,例如:n為3, 中間的位置就是(1,1),n為5,中間位置為(2, 2)
        int count = 1; // 用來給矩陣中每一個(gè)空格賦值
        int offset = 1; // 需要控制每一條邊遍歷的長度,每次循環(huán)右邊界收縮一位
        int i,j;
        while (loop --) {
            i = startx;
            j = starty;

            // 下面開始的四個(gè)for就是模擬轉(zhuǎn)了一圈
            // 模擬填充上行從左到右(左閉右開)
            for (j = starty; j < n - offset; j++) {
                res[startx][j] = count++;
            }
            // 模擬填充右列從上到下(左閉右開)
            for (i = startx; i < n - offset; i++) {
                res[i][j] = count++;
            }
            // 模擬填充下行從右到左(左閉右開)
            for (; j > starty; j--) {
                res[i][j] = count++;
            }
            // 模擬填充左列從下到上(左閉右開)
            for (; i > startx; i--) {
                res[i][j] = count++;
            }

            // 第二圈開始的時(shí)候,起始位置要各自加1, 例如:第一圈起始位置是(0, 0),第二圈起始位置是(1, 1)
            startx++;
            starty++;

            // offset 控制每一圈里每一條邊遍歷的長度
            offset += 1;
        }

        // 如果n為奇數(shù)的話,需要單獨(dú)給矩陣最中間的位置賦值
        if (n % 2) {
            res[mid][mid] = count;
        }
        return res;
    }
};

數(shù)組總結(jié)篇

二分法

數(shù)組:每次遇到二分法,都是一看就會,一寫就廢

這道題目呢,考察數(shù)組的基本操作,思路很簡單,但是通過率在簡單題里并不高,不要輕敵。

可以使用暴力解法,通過這道題目,如果追求更優(yōu)的算法,建議試一試用二分法,來解決這道題目

  • 暴力解法時(shí)間復(fù)雜度:O(n)
  • 二分法時(shí)間復(fù)雜度:O(logn)

在這道題目中我們講到了循環(huán)不變量原則,只有在循環(huán)中堅(jiān)持對區(qū)間的定義,才能清楚的把握循環(huán)中的各種細(xì)節(jié)。

二分法是算法面試中的??碱},建議通過這道題目,鍛煉自己手撕二分的能力。

雙指針法
  • 數(shù)組:就移除個(gè)元素很難么?

雙指針法(快慢指針法):通過一個(gè)快指針和慢指針在一個(gè)for循環(huán)下完成兩個(gè)for循環(huán)的工作。

  • 暴力解法時(shí)間復(fù)雜度:O(n^2)
  • 雙指針時(shí)間復(fù)雜度:O(n)

這道題目迷惑了不少同學(xué),糾結(jié)于數(shù)組中的元素為什么不能刪除,主要是因?yàn)橐韵聝牲c(diǎn):

  • 數(shù)組在內(nèi)存中是連續(xù)的地址空間,不能釋放單一元素,如果要釋放,就是全釋放(程序運(yùn)行結(jié)束,回收內(nèi)存??臻g)。
  • C++中vector和array的區(qū)別一定要弄清楚,vector的底層實(shí)現(xiàn)是array,封裝后使用更友好。

雙指針法(快慢指針法)在數(shù)組和鏈表的操作中是非常常見的,很多考察數(shù)組和鏈表操作的面試題,都使用雙指針法。

滑動窗口
  • 數(shù)組:滑動窗口拯救了你

本題介紹了數(shù)組操作中的另一個(gè)重要思想:滑動窗口。

  • 暴力解法時(shí)間復(fù)雜度:O(n^2)
  • 滑動窗口時(shí)間復(fù)雜度:O(n)

本題中,主要要理解滑動窗口如何移動 窗口起始位置,達(dá)到動態(tài)更新窗口大小的,從而得出長度最小的符合條件的長度。

滑動窗口的精妙之處在于根據(jù)當(dāng)前子序列和大小的情況,不斷調(diào)節(jié)子序列的起始位置。從而將O(n^2)的暴力解法降為O(n)。

如果沒有接觸過這一類的方法,很難想到類似的解題思路,滑動窗口方法還是很巧妙的。

模擬行為
  • 數(shù)組:這個(gè)循環(huán)可以轉(zhuǎn)懵很多人!

模擬類的題目在數(shù)組中很常見,不涉及到什么算法,就是單純的模擬,十分考察大家對代碼的掌控能力。

在這道題目中,我們再一次介紹到了循環(huán)不變量原則,其實(shí)這也是寫程序中的重要原則。

相信大家有遇到過這種情況: 感覺題目的邊界調(diào)節(jié)超多,一波接著一波的判斷,找邊界,拆了東墻補(bǔ)西墻,好不容易運(yùn)行通過了,代碼寫的十分冗余,毫無章法,其實(shí)真正解決題目的代碼都是簡潔的,或者有原則性的,大家可以在這道題目中體會到這一點(diǎn)。文章來源地址http://www.zghlxwxcb.cn/news/detail-426688.html

到了這里,關(guān)于代碼隨想錄Day02:977.有序數(shù)組的平方 ,209.長度最小的子數(shù)組 ,59.螺旋矩陣II的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 【C++代碼】有序數(shù)組的平方,長度最小的子數(shù)組,螺旋矩陣 II--代碼隨想錄

    【C++代碼】有序數(shù)組的平方,長度最小的子數(shù)組,螺旋矩陣 II--代碼隨想錄

    題目:有序數(shù)組的平方 給你一個(gè)按 非遞減順序 排序的整數(shù)數(shù)組 nums ,返回 每個(gè)數(shù)字的平方 組成的新數(shù)組,要求也按 非遞減順序 排序。 題解 數(shù)組其實(shí)是有序的, 只不過負(fù)數(shù)平方之后可能成為最大數(shù)了。那么數(shù)組平方的最大值就在數(shù)組的兩端, 不是最左邊就是最右邊,不

    2024年02月11日
    瀏覽(47)
  • Day02 977.有序數(shù)組的平方 209.長度最小的子數(shù)組 59.螺旋矩陣II

    https://leetcode.cn/problems/squares-of-a-sorted-array/ 時(shí)間復(fù)雜度O(n) https://leetcode.cn/problems/minimum-size-subarray-sum/ 時(shí)間復(fù)雜度:O(n) 看每一個(gè)元素被操作的次數(shù),每個(gè)元素在滑動窗后進(jìn)來操作一次,出去操作一次,每個(gè)元素都是被操作兩次,所以時(shí)間復(fù)雜度是 2 × n 也就是O(n)。 空間復(fù)雜度

    2023年04月18日
    瀏覽(17)
  • day2-數(shù)組part02| 977.有序數(shù)組的平方、 209.長度最小的子數(shù)組、 59.螺旋矩陣II

    數(shù)組平方后的最大值只可能在數(shù)組兩端,不可能在中間 設(shè)置雙指針,比較兩個(gè)指針?biāo)钢档拇笮。涗涊^大值,接著向中間移動這個(gè)指針 結(jié)束條件:左右指針相背 暴力一直不過,明天再補(bǔ)一下 不斷的調(diào)節(jié)子序列的起始位置和終止位置,從而得出我們要想的結(jié)果。 思路 子數(shù)

    2024年02月02日
    瀏覽(19)
  • 代碼隨想錄day02

    ● 力扣題目鏈接 ● 給你一個(gè)按 非遞減順序 排序的整數(shù)數(shù)組 nums,返回 每個(gè)數(shù)字的平方 組成的新數(shù)組,要求也按 非遞減順序 排序。 思路 ● 暴力排序,時(shí)間復(fù)雜度O(n + nlogn) ● 使用雙指針,時(shí)間復(fù)雜度O(n) 代碼 ● 力扣題目鏈接 ● 給定一個(gè)含有 n 個(gè)正整數(shù)的數(shù)組和一個(gè)正整

    2024年02月13日
    瀏覽(104)
  • 【Day45】代碼隨想錄之動態(tài)規(guī)劃part7—爬樓梯(進(jìn)階)、零錢兌換、完全平方數(shù)

    【Day45】代碼隨想錄之動態(tài)規(guī)劃part7—爬樓梯(進(jìn)階)、零錢兌換、完全平方數(shù)

    今天又是補(bǔ)打卡的一天,開沖?。?! 今日任務(wù): 70.爬樓梯(進(jìn)階) 322.零錢兌換 279.完全平方數(shù) 這道題之前做過一次,但是可以采用完全背包的問題來分析一遍。 卡瑪網(wǎng)題目:【57.爬樓梯】 這個(gè)題目其實(shí)是更難了一點(diǎn),因?yàn)榍懊娴念}目都是每次要不爬1階樓梯,要不爬2階樓

    2024年03月25日
    瀏覽(33)
  • 代碼隨想錄Day4 | 鏈表02-leetcode24、19、面試題02.07、142

    題目鏈接:兩兩交換鏈表中的節(jié)點(diǎn) 思路: 雙指針p1、p2,分別指向每次需要交換的節(jié)點(diǎn)。交換過程為p2的next指向p1,p1的next指向p2的next, 還需要注意將p1de前一個(gè)指針指向交換后的p2以確保不斷鏈 。 1. 空鏈 or 只有頭結(jié)點(diǎn)? - 直接返回head,無需做任何修改 2. 交換需要記錄前驅(qū)

    2024年02月12日
    瀏覽(27)
  • 代碼隨想錄Day1 | 數(shù)組01- leetcode 704、27

    題目鏈接:二分查找 關(guān)鍵問題: ????????- 邊界(left、right)、當(dāng)前查找值(middle) ? ? ? ? ? ? ? ? - target大于當(dāng)前查找值 -- 當(dāng)前查找區(qū)域的右邊,更改區(qū)間left ? ? ? ? ? ? ? ? - target小于當(dāng)前查找值 -- 當(dāng)前查找區(qū)域的左邊,更改區(qū)間right ? ? ? ? ? ? ? ? - middle的計(jì)

    2024年02月16日
    瀏覽(88)
  • Day 2 數(shù)組:977.有序數(shù)組的平方 209.長度最小的子數(shù)組 59.螺旋矩陣Ⅱ

    Day 2 數(shù)組:977.有序數(shù)組的平方 209.長度最小的子數(shù)組 59.螺旋矩陣Ⅱ

    977.有序數(shù)組的平方 題目鏈接 ??思路 暴力解法 將數(shù)組內(nèi)每個(gè)數(shù)平方每個(gè)數(shù)平方之后,按升序排序 代碼如下: 時(shí)間復(fù)雜度: O ( ? n l o g n ) O( nlogn) O ( ? n l o g n ) 空間復(fù)雜度: O ( 1 ) O(1) O ( 1 ) 時(shí)間復(fù)雜度具體分析: for循環(huán): O(n) 快速排序 : O(nlogn) 因此時(shí)間復(fù)雜度是 O ( ?

    2024年02月10日
    瀏覽(50)
  • 算法訓(xùn)練 Day 2 | 數(shù)組:977.有序數(shù)組的平方,209.長度最小的子數(shù)組,59.螺旋矩陣II

    977. 有序數(shù)組的平方 第一想法:暴力破解 看完題解想法:朝著雙指針方向想 遇到困難: 用雙指針的話,一開始想到兩邊指針往中間靠,逐個(gè)將最大值賦給結(jié)果數(shù)組。和題解不同的是,循環(huán)條件我寫了? while (left != right) {...} ,相比于題解的? while (left = right) {...} ,我需要在后

    2023年04月12日
    瀏覽(29)
  • 代碼隨想錄day6|哈希表理論基礎(chǔ)、有效的字母異位詞、兩個(gè)數(shù)組的交集、快樂數(shù)、兩數(shù)之和

    代碼隨想錄day6|哈希表理論基礎(chǔ)、有效的字母異位詞、兩個(gè)數(shù)組的交集、快樂數(shù)、兩數(shù)之和

    當(dāng)需要判斷一個(gè)元素是否在一個(gè)集合中,哈希表的時(shí)間復(fù)雜度只有O(1)。 哈希表有一個(gè)映射的操作,當(dāng)映射的元素在同一個(gè)索引下標(biāo)的位置,就會引發(fā) 哈希碰撞 。 哈希碰撞的兩種解決方法:拉鏈法 線性探測法? ?同時(shí),哈希表還有常見的三種數(shù)據(jù)結(jié)構(gòu):分別是數(shù)組、集合s

    2024年02月06日
    瀏覽(24)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包