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

算法訓(xùn)練第二天|977.有序數(shù)組的平方、209.長度最小的有序數(shù)組、59.螺旋矩陣2

這篇具有很好參考價值的文章主要介紹了算法訓(xùn)練第二天|977.有序數(shù)組的平方、209.長度最小的有序數(shù)組、59.螺旋矩陣2。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

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

題目鏈接:力扣

思路:同樣使用雙指針的方法,這樣就可以只遍歷一次原數(shù)組。

可以考慮需要按照一個順序來遍歷,那就是從大到小或者從小到大,我選擇的是從大到小。

不難看出,原數(shù)組將每個數(shù)平方后,呈現(xiàn)從兩邊到中間逐漸減小的規(guī)律。

所以使用一個指針指向原數(shù)組最左端,一個指向最右端,比較那邊的數(shù)大,就是原數(shù)組中最大的數(shù)。

我們新建一個數(shù)組,用來存放已經(jīng)排好序的數(shù)組,按照從大到小放數(shù)據(jù)應(yīng)該是從數(shù)組尾開始放。

時間復(fù)雜度:o(n)

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        //這個個地方用.size()函數(shù)來求數(shù)組的長度,注意是vector數(shù)組的函數(shù)方法
        int len=nums.size();
        for(int i=0;i<len;i++) nums[i] = nums[i]*nums[i];
        //需要注意這里vector數(shù)組的定義方法,不會就搜索一下
        vector<int> numss(len);
        //這里使用雙指針i,j來遍歷原數(shù)組
        //同時用一個指針來完成將數(shù)據(jù)放入排序好的數(shù)組
        int i=0,j=len-1,k=len-1;
        //這里每個人可以根據(jù)個人喜好使用不同的循環(huán)語句,for循環(huán)也可以做到
        while(true){
            if(nums[i]<nums[j]){
                numss[k]=nums[j];
                j--;
            }
            else{
                numss[k]=nums[i];
                i++;
            }
            k--;
            if(k<0) break;
        }
        return numss;
    }
};

?本題的難點在于如何考慮到只用時間復(fù)雜度為o(n)的方法,即只遍歷一次原數(shù)組,需要根據(jù)平方后的原數(shù)組找到按從大到小或從小到大的規(guī)律。

209.長度最小的子數(shù)組

題目鏈接:力扣

思路:使用滑動窗口的方法,我們可以想到子序列的變化方法就是,當(dāng)子序列之和大于目標(biāo)值,就要從開頭減去一個,小于目標(biāo)值時,就要從后面再添加進(jìn)一個。

但是我們要考慮所有子序列的可能性,即所有的數(shù)組元素都可能成為子序列的開頭或結(jié)尾,當(dāng)我選擇子序列是從左往右滑動時,那么子序列的結(jié)尾是規(guī)律的,即每次添加一個元素。

而對應(yīng)于每個子序列的結(jié)尾,子序列的開頭可以是在這之前的任意一個元素,但實際上卻并不用考慮在這之前的每個元素,因為當(dāng)結(jié)尾在往右遍歷時,開頭也在往右遍歷,我們只需考慮當(dāng)前開頭的后面元素,而不必考慮當(dāng)前開頭的之前元素。

時間復(fù)雜度:nlogn?

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        //用result來表示最短子序列的長度,先將其賦值為整形最大值是考慮到每次都是按子序列長度更小的進(jìn)行賦值,本題中數(shù)組可能不存在滿足條件的子序列,則result沒有被賦值,輸出0;
        int result = INT_MAX;
        //用sum來表示當(dāng)前子序列內(nèi)所有數(shù)的和
        int sum=0;
        //用i來表示子序列開頭的位置
        int i=0;
        for(int j=0;j<nums.size();j++){
            //j是用來表示子序列結(jié)束的位置,因為我們考慮到數(shù)組的每個元素都有可能成為子序列的結(jié)束位置。
            sum+=nums[j];
            //當(dāng)添加一個元素進(jìn)去后,那么子序列的總和就有可能超過目標(biāo)元素,此時我們需要將子序列中元素減去一個,很顯然就是從開頭減去,因為子序列是連續(xù)的。
            while(sum>=target){
                //len表示子序列的長度
                int len=j-i+1;
                //此時result是表示所有滿足條件的自序中長度最小的,所以它是一個要和所有長度比較的變量,遇到更小的就賦值。
                result=result>len?len:result;
                sum-=nums[i];
                i++;

            }
        }
        return result==INT_MAX?0:result;

    }
};

滑動窗口的運用讓我想到字符串匹配是不是也可以用這種方法?只要是連續(xù)的子序列仿佛都可以用。?

?59.螺旋矩陣2

題目:力扣

思路:數(shù)組里的題最難的就是找出規(guī)律,當(dāng)規(guī)律被發(fā)現(xiàn)了,答案也就浮出水面了。

看到這題,相信每個人都能想到,需要四條邊逐邊進(jìn)行賦值,那么比較難的就是進(jìn)行四條邊的規(guī)律統(tǒng)一,首先找到的就是每四條長度相等的且互相不重復(fù)的邊可以構(gòu)成一個完整的圈,每條邊包含一個拐點。

首先思考每次循環(huán)一圈的起點在哪里,自己在紙上寫一個n=5比較大的循環(huán),就可以發(fā)現(xiàn)每次的起點在數(shù)組的主對角線上。此處需要一個變量來表示。

其次我們也觀察到,每一圈每一條邊需要賦值的元素都在減少一此處也需要一個變量表示。但我沒用這個變量表示每條邊需要走的步數(shù),而是用每圈右邊界少抵達(dá)的坐標(biāo)來表示。這樣間接可以用起點減去這個邊界來表示要走的步數(shù)。

最后發(fā)現(xiàn),當(dāng)n為奇數(shù)時,所有的圈走完,還剩中心一個元素沒有賦值,我們需要單獨為它賦值。?

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>> res(n,vector<int>(n,0));
        //用來表示每圈的起點坐標(biāo)
        int starti=0,startj=0;
        //key用來控制需要循環(huán)幾圈
        int key=n/2;
        //count用來表示需要填入數(shù)組的數(shù)1,2,3,4...
        int count=1;
        //用來控制左右邊界需要收縮多少,每次循環(huán)右邊界多收縮一位,從第二次循環(huán)開始左邊界收縮一位,其實就是每次循環(huán),一條邊走幾步
        int bianjie=1;
        while(key--){
            int i=starti,j=startj;
            for(;j<n-bianjie;j++) res[i][j]=count++;
            for(;i<n-bianjie;i++) res[i][j]=count++;
            for(;j>startj;j--) res[i][j]=count++;
            for(;i>starti;i--) res[i][j]=count++;
            starti++;
            startj++;
            bianjie++;
        }
        if(n%2==1) res[starti][startj]=count;
        return res;
    }
};

本題難點在于找到規(guī)律,和尋找自己需要表示的變量,應(yīng)該不用自己想出來怎么寫,只要看懂別人的思路,然后自己能敲出來代碼,以后碰到類似的題能想起來這個思路就行。?文章來源地址http://www.zghlxwxcb.cn/news/detail-421438.html

到了這里,關(guān)于算法訓(xùn)練第二天|977.有序數(shù)組的平方、209.長度最小的有序數(shù)組、59.螺旋矩陣2的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

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

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

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

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

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

    2023年04月18日
    瀏覽(17)
  • Leetcode 977-有序數(shù)組的平方 | LeetCode209-長度最小的子數(shù)組 | Leetcode59-螺旋矩陣

    給你一個按 非遞減順序 排序的整數(shù)數(shù)組 nums,返回 每個數(shù)字的平方 組成的新數(shù)組,要求也按 非遞減順序 排序。 思考: 這個數(shù)組為有序數(shù)組,那么即使前面有負(fù)的,數(shù)組平方的最大值只能是在數(shù)組的倆端,不是在左邊就是右邊,不可能是在中間 由此想到雙指針做法,left從

    2024年02月16日
    瀏覽(28)
  • 代碼隨想錄Day02:977.有序數(shù)組的平方 ,209.長度最小的子數(shù)組 ,59.螺旋矩陣II

    977.有序數(shù)組的平方 【 題目建議 】: 本題關(guān)鍵在于理解雙指針?biāo)枷?【隨想錄文章講解】 【卡哥視頻講解】 方法一:暴力排序法 **思路:**先對數(shù)組中每個數(shù)進(jìn)行平方運算,然后再排序 時間復(fù)雜度是 O(n + nlogn) 其中包括計算平方數(shù)組的O(n)和快速排序的O(nlogn),總體上是O(nlo

    2023年04月27日
    瀏覽(26)
  • LeetCode-Day2-977.有序數(shù)組的平方 ,209.長度最小的子數(shù)組 ,59.螺旋矩陣II ,

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

    雙指針法,原來數(shù)組是有序的,說明平房之后最左和最右兩邊的平方和是最大的,比較最大的插入新的vector數(shù)組,然后移動指針選下一個元素進(jìn)行比較。 接下來就開始介紹數(shù)組操作中另一個重要的方法: 滑動窗口 。 所謂滑動窗口, 就是不斷的調(diào)節(jié)子序列的起始位置和終止

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

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

    2024年02月02日
    瀏覽(19)
  • 【LeetCode題目詳解】 977.有序數(shù)組的平方 209.長度最小的子數(shù)組59.螺旋矩陣II day2

    【LeetCode題目詳解】 977.有序數(shù)組的平方 209.長度最小的子數(shù)組59.螺旋矩陣II day2

    看完這個題目第一想法就是直接暴力解決,直接將全部平方然后進(jìn)行排序。比如快排。 代碼如下: 時間復(fù)雜度是 O(nlogn)或者說【O(n + nlogn)】,括號里面這個是為了比較接下來的方法。 然后看了代碼隨想錄的視頻學(xué)習(xí)了用雙指針來寫這道題的方法(說實話不看視頻真沒想到可

    2024年02月13日
    瀏覽(25)
  • 【力扣】977. 有序數(shù)組的平方 <首尾指針>

    給你一個按 非遞減順序 排序的整數(shù)數(shù)組 nums,返回 每個數(shù)字的平方 組成的新數(shù)組,要求也按 非遞減順序 排序。 示例 1: 輸入 :nums = [-4,-1,0,3,10] 輸出 :[0,1,9,16,100] 解釋 :平方后,數(shù)組變?yōu)?[16,1,0,9,100],排序后,數(shù)組變?yōu)?[0,1,9,16,100] 示例 2: 輸入 :nums = [-7,-3,2,3,11] 輸出

    2024年02月14日
    瀏覽(30)
  • 算法-有序數(shù)組的平方,長度最小的子數(shù)組,螺旋矩陣II

    算法-有序數(shù)組的平方,長度最小的子數(shù)組,螺旋矩陣II

    偽裝成一個老手! 題目 給你一個按 非遞減順序 排序的整數(shù)數(shù)組 nums,返回每個數(shù)字的平方組成的新數(shù)組,要求也按非遞減順序排序。 示例 : 輸入:nums = [-4,-1,0,3,10] 輸出:[0,1,9,16,100] 解釋:平方后,數(shù)組變?yōu)?[16,1,0,9,100] 排序后,數(shù)組變?yōu)?[0,1,9,16,100] 來源:力扣977 思路 遍

    2024年02月11日
    瀏覽(27)
  • LeetCode每日一題【977. 有序數(shù)組的平方】

    LeetCode每日一題【977. 有序數(shù)組的平方】

    題目: 思路: 直接每個元素平方,然后排序,比較簡單 雙指針,一頭一尾,每次比較頭指針元素平方與尾指針元素平方的大小,若頭指針的元素平方比較大,則頭指針往后移動,否則尾指針往前移動

    2024年02月20日
    瀏覽(25)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包