iT邦幫忙

2026 iThome 鐵人賽

DAY 6
0
Software Development

30天刷完leetcoode75系列 第 6

C++ 演算法練習 Day6|1004, 1493, 1732題解與思路分享

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20260920/20184265VjxHQg3W3Q.png

題目解析: 給定一個只包含0與1的陣列,你最多可以將k個0變成1,找出翻轉後能連成最長連續1的長度
解題思路: 先設左邊界n和記錄最大長度的ans為0,然後丟進迴圈讓右邊界i開始跑,如果遇到0就把k減1。如果k被扣到小於0代表額度用完了,就進入迴圈移動左邊界n,如果n指到的是0就把k加回來,並把n往前推。每次迴圈都會計算當前視窗的長度並更新ans,最後回傳ans

class Solution {
public:
    int longestOnes(vector<int>& nums, int k) {
        int n = 0, ans = 0;
        for(int i=0; i<nums.size(); i++){
            if(nums[i] == 0) k--;

            while(k < 0){
                if(nums[n] == 0) k++;
                n++;
            }

            ans = max(ans, i - n + 1);
        }

        return ans;
    }
};

https://ithelp.ithome.com.tw/upload/images/20260920/20184265ppr4YzrKjx.png

題目解析: 給定一個只包含0與1的陣列,你必須從中刪除剛好一個元素,找出刪除後能連成最長連續1的子陣列長度
解題思路: 先設一個陣列v用來記錄每一段連續1的長度,以及記錄總共有幾個1的變數t和當前連續1數量的q。接著丟進迴圈開始跑,遇到1就把q跟t都加1,遇到0就把當前的q存入v陣列並將q歸零。跑完迴圈後,把最後剩餘的q跟一個0補進v陣列裡。然後再跑一次迴圈把v陣列裡相鄰的兩個數字相加,找出最大值並記錄進ans。最後判斷如果原陣列全都是1(t等於陣列長度),因為規定一定要刪除一個數字所以回傳ans減1,否則直接回傳ans

class Solution {
public:
    int longestSubarray(vector<int>& nums) {
        vector<int> v;
        int ans = 0, q = 0, t = 0;
        for(int i=0; i<nums.size(); i++){
            if(nums[i] == 1){
                q++;
                t++;
            }else{
                v.push_back(q);
                q = 0;
            }
        }

        v.push_back(q);
        v.push_back(0);
        for(int i=0; i<v.size()-1; i++){
            ans = max(ans, v[i] + v[i+1]);
        }

        if(t == nums.size()) return ans-1;
        return ans;
    }
};

https://ithelp.ithome.com.tw/upload/images/20260920/20184265JqaJDxc8Sa.png

題目解析: 給定一個陣列記錄每次移動後的海拔高度變化,已知起點的海拔為0,找出旅途中所達到的最高海拔高度。
解題思路: 先設定記錄最高海拔的ans為0,以及記錄當前海拔的n為0。接著丟進迴圈開始跑,每次將當前的高度變化加到n上面,並透過max函數持續更新ans以維持最大值,迴圈跑完後回傳ans。

class Solution {
public:
    int largestAltitude(vector<int>& gain) {
        int ans = 0, n = 0;
        for(int i=0; i<gain.size(); i++){
            n += gain[i];
            ans = max(ans, n);
        }

        return ans;
    }
};

上一篇
C++ 演算法練習 Day5|1679, 643, 1456 題解與思路分享
系列文
30天刷完leetcoode756
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言