
題目解析: 給定一個只包含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;
}
};

題目解析: 給定一個只包含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;
}
};

題目解析: 給定一個陣列記錄每次移動後的海拔高度變化,已知起點的海拔為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;
}
};