day2算法學(xué)習(xí)打卡 | 977.有序數(shù)組的平方 ,209.長(zhǎng)度最小的子數(shù)組 泛范,59.螺旋矩陣II

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

題目描述:
給你一個(gè)按 非遞減順序 排序的整數(shù)數(shù)組 nums让虐,返回 每個(gè)數(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]

題目地址: 有序數(shù)組平方
思路:

  • 方法一:暴力解法区赵,也是最容易想到的惭缰,直接數(shù)組的平方,然后對(duì)數(shù)組進(jìn)行排序就行笼才。
  • 方法二: 運(yùn)用雙指針法漱受,因?yàn)橛行驍?shù)組存在負(fù)數(shù),所以最大值一定是在兩邊的骡送,最小值在中間昂羡,我們可以左右指針法,兩邊比較大小摔踱,然后存到新數(shù)組里虐先,最終左右指針碰面循環(huán)結(jié)束(left可以等于right)。

代碼實(shí)現(xiàn):

vector<int> sortedSquares(vector<int>& nums) {
        if (nums.empty()) {
            return nums;//空數(shù)組直接退出
        }
        vector<int> new_nums(nums.size(), 0);
        int i = 0, j = nums.size() - 1;
        int pingfang1 = 0, pingfang2 = 0;
        int count = j;//用來對(duì)新數(shù)組進(jìn)行賦值
        while(i <= j) {
            pingfang1 = nums[i] * nums[i];
            pingfang2 = nums[j] * nums[j];
            if (pingfang1 <= pingfang2) {
                new_nums[count--] = pingfang2;
                j--;
            } else {
                new_nums[count--] = pingfang1;
                i++;
            }
        }
        return new_nums;
    }

時(shí)間復(fù)雜度:O(n)派敷,空間復(fù)雜度:O(1)

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

題目描述:
給定一個(gè)含有 n 個(gè)正整數(shù)的數(shù)組和一個(gè)正整數(shù) target 蛹批。找出該數(shù)組中滿足其總和大于等于 target 的長(zhǎng)度最小的 連續(xù)子數(shù)組 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其長(zhǎng)度篮愉。如果不存在符合條件的子數(shù)組腐芍,返回 0 。

示例 1:
輸入:target = 7, nums = [2,3,1,2,4,3]
輸出:2
解釋:子數(shù)組 [4,3] 是該條件下的長(zhǎng)度最小的子數(shù)組试躏。

題目鏈接: 長(zhǎng)度最小的子數(shù)組

思路:

  • 方法一:暴力解法猪勇,直接使用雙層for循環(huán),判斷以數(shù)組第一個(gè)元素颠蕴、第二個(gè)元素埠对。络断。。開始的子數(shù)組哪個(gè)符合條件项玛,然后比較出最小子數(shù)組貌笨。復(fù)雜度:O(n^2)
  • 方法二:滑動(dòng)窗口法(也是雙指針)〗缶冢快指針去遍歷數(shù)組锥惋,直到走到sum大于target位置時(shí),移動(dòng)慢指針到剛好sum小于target位置开伏,記錄子數(shù)組長(zhǎng)度膀跌,這樣窗口可以始終保持最小,時(shí)間復(fù)雜度為O(n)固灵;


    209.長(zhǎng)度最小的子數(shù)組.gif

代碼實(shí)現(xiàn):

int minSubArrayLen(int target, vector<int>& nums) {
        int sum = 0;//遍歷數(shù)組時(shí)捅伤,求和
        int i = 0, j = 0;//i為起始位置,j為終止位置巫玻,兩者控制窗口大小
        int sub_result = 0;//改變i時(shí)丛忆,用于存放子數(shù)組大小
        int result = nums.size() + 1; //存放最終結(jié)果,初始值要大于數(shù)組長(zhǎng)度仍秤,最后可以用于判斷是否不存在子數(shù)組
        while(j < nums.size()) {
            sum += nums[j];
            while(sum >= target) {
                sub_result = j - i + 1;
                result = result > sub_result ? sub_result : result;
                sum -= nums[i++];
            }
            j++;
        }
        return result == nums.size() + 1 ? 0 : result;//判斷是不是沒有子數(shù)組符合條件
    }

難點(diǎn)總結(jié):

  • 如何控制窗口大邢ü睢?
    窗口就是 滿足其和 ≥ s 的長(zhǎng)度最小的 連續(xù) 子數(shù)組诗力。
    窗口的起始位置如何移動(dòng):如果當(dāng)前窗口的值大于s了凰浮,窗口就要向前移動(dòng)了(也就是該縮小了)。
    窗口的結(jié)束位置如何移動(dòng):窗口的結(jié)束位置就是遍歷數(shù)組的指針苇本,也就是for循環(huán)里的索引袜茧。
    其實(shí)和原地刪除數(shù)組元素的快慢指針類似
  • 注意整個(gè)數(shù)組都不符合target的情況

59.螺旋矩陣II

題目描述:
給你一個(gè)正整數(shù) n ,生成一個(gè)包含 1 到 n2 所有元素瓣窄,且元素按順時(shí)針順序螺旋排列的 n x n 正方形矩陣 matrix 惫周。

示例 1:


spiraln.jpeg

輸入:n = 3
輸出:[[1,2,3],[8,9,4],[7,6,5]]
題目鏈接: 59.螺旋矩陣II

難點(diǎn):

  • 如何畫矩陣,畫幾圈康栈、每圈畫幾個(gè)元素(循環(huán)不變量),每次畫邊保持循環(huán)不變量不變喷橙,就不容易出錯(cuò)啥么。

思路:

  1. 首先確定要畫幾圈,因?yàn)槊看萎嬕蝗褪莾尚袃闪蟹∮猓灾恍枰?n / 2圈悬荣,n = 3 就畫一圈,n = 4 就畫兩圈
  2. 確定每圈的起始位置疙剑,剛開始肯定是(0氯迂,0)践叠,之后每次加1即可。
  3. 確定每次畫幾個(gè)元素嚼蚀,其實(shí)只要確定好開頭和結(jié)尾位置就可以了禁灼,以上圖為例,n = 3轿曙, 那么我們就每條邊畫2個(gè)元素(n - 1)弄捕,剛好是一圈,畫第二圈的時(shí)候要畫幾個(gè)元素呢导帝?守谓,因?yàn)橥馊σ呀?jīng)畫了肯定不能是n - 1,此時(shí)我們需要的是n - 2您单, 第3圈就是n - 3斋荞,再看由于外圈畫完少了一圈,所以我們可以加一個(gè)變量用來控制每次畫完一圈后的偏移量offect虐秦,畫第二圈的偏移量就是offect + 1(畫一圈少兩行兩列平酿,offect控制結(jié)束,startx控制開始)
  4. 由于當(dāng)n為奇數(shù)的時(shí)候羡疗,中間元素只有一個(gè)染服,不需要畫邊,可以最后單獨(dú)賦值叨恨。

代碼實(shí)現(xiàn):

vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>> nums(n, vector<int>(n, 0));
        int startx = 0, starty = 0;
        int offect = 1; //控制偏移量
        int i = 0, j = 0;
        int count = 1;
        int loop = n / 2; //控制循環(huán)幾圈
        while(loop--) {
            cout << count << " " << startx << " " << starty << endl;
            for (i = startx, j = starty; j < n - offect; ++j) {
                nums[i][j] = count++;
            }
            cout << count << " " << startx << " " << starty << endl;
            for (i = startx, j; i < n - offect; ++i) {
                nums[i][j] = count++;
            }
            for (i, j; j > starty; --j) {
                nums[i][j] = count++;
            }
            for (i,j; i > startx; --i) {
                nums[i][j] = count++;
            }
            startx += 1;//每一圈的起始元素都?1
            starty += 1;
            offect += 1;//用來控制每條邊遍歷的長(zhǎng)度柳刮,因?yàn)椋孔咭蝗ffect - 1
        }

        //當(dāng)n為奇數(shù)時(shí)痒钝,最后一圈為一個(gè)元素秉颗,單獨(dú)賦值,偶數(shù)可以在循環(huán)里賦值
        int mid = n / 2;
        if (n % 2 != 0) {
            nums[mid][mid] = count;
        }
        return nums;
    }

收獲:

  • 前兩道題是雙指針法的運(yùn)用,尤其滑動(dòng)窗口法送矩,比較巧妙蚕甥,如何控制窗口大小,開始位置什么時(shí)候變栋荸,結(jié)尾位置怎么控制
  • 最后一道題是模擬矩陣菇怀,需要考慮的點(diǎn)比較多,幾圈晌块,每圈的起始位置爱沟,以及保持左閉右開的循環(huán)不變量原則,還有n為奇數(shù)時(shí)要怎么處理匆背。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末呼伸,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子钝尸,更是在濱河造成了極大的恐慌括享,老刑警劉巖搂根,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)瞪慧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來隙咸,“玉大人,你說我怎么就攤上這事成洗∥宥剑” “怎么了?”我有些...
    開封第一講書人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵瓶殃,是天一觀的道長(zhǎng)充包。 經(jīng)常有香客問我,道長(zhǎng)遥椿,這世上最難降的妖魔是什么基矮? 我笑而不...
    開封第一講書人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮冠场,結(jié)果婚禮上家浇,老公的妹妹穿的比我還像新娘。我一直安慰自己碴裙,他們只是感情好钢悲,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著舔株,像睡著了一般莺琳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上载慈,一...
    開封第一講書人閱讀 51,443評(píng)論 1 302
  • 那天惭等,我揣著相機(jī)與錄音,去河邊找鬼办铡。 笑死辞做,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的寡具。 我是一名探鬼主播秤茅,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼晒杈!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起孔厉,我...
    開封第一講書人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤拯钻,失蹤者是張志新(化名)和其女友劉穎帖努,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體粪般,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拼余,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了亩歹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片匙监。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖小作,靈堂內(nèi)的尸體忽然破棺而出亭姥,到底是詐尸還是另有隱情,我是刑警寧澤顾稀,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布达罗,位于F島的核電站,受9級(jí)特大地震影響静秆,放射性物質(zhì)發(fā)生泄漏粮揉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一抚笔、第九天 我趴在偏房一處隱蔽的房頂上張望扶认。 院中可真熱鬧,春花似錦殊橙、人聲如沸辐宾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)螃概。三九已至,卻和暖如春鸽疾,著一層夾襖步出監(jiān)牢的瞬間吊洼,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工制肮, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留冒窍,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓豺鼻,卻偏偏與公主長(zhǎng)得像综液,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子儒飒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容