劍指 Offer 42. 連續子數組的最大和
輸入一個整型數組,數組中的一個或連續多個整數組成一個子數組。求所有子數組的和的最大值。要求時間複雜度爲O(n)。
示例1:
輸入: nums = [-2,1,-3,4,-1,2,1,-5,4]
輸出: 6
解釋: 連續子數組 [4,-1,2,1] 的和最大,爲 6。
提示:
1 <= arr.length <= 10^5
-100 <= arr[i] <= 100
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int ans = -999, t = 0;
for (const auto& e : nums)
{
// if (t <= 0) {
// t = e;
// } else {
// t += e;
// }
t = max(t + e, e);
ans = max(ans, t);
}
return ans;
}
};
152. 乘積最大子數組
給你一個整數數組 nums ,請你找出數組中乘積最大的非空連續子數組(該子數組中至少包含一個數字),並返回該子數組所對應的乘積。
測試用例的答案是一個 32-位 整數。子數組 是數組的連續子序列。
示例 1:
輸入: nums = [2,3,-2,4]
輸出: 6
解釋: 子數組 [2,3] 有最大乘積 6。
示例 2:
輸入: nums = [-2,0,-1]
輸出: 0
解釋: 結果不能爲 2, 因爲 [-2,-1] 不是子數組。
提示:
1 <= nums.length <= 2 * 104
-10 <= nums[i] <= 10
nums 的任何前綴或後綴的乘積都 保證 是一個 32-位 整數
class Solution {
public:
int maxProduct(vector<int>& nums) {
int p_max = 1, p_min = 1;
int ans = -999;
for (const auto& e : nums)
{
int max_tmp = p_max, min_tmp = p_min;
p_max = max(max(max_tmp * e, e), min_tmp * e);
p_min = min(min(max_tmp * e, e), min_tmp * e);
ans = max(ans, p_max);
}
return ans;
}
};
300. 最長遞增子序列
給你一個整數數組 nums ,找到其中最長嚴格遞增子序列的長度。子序列 是由數組派生而來的序列,刪除(或不刪除)數組中的元素而不改變其餘元素的順序。例如,[3,6,2,7] 是數組 [0,3,1,6,2,2,7] 的子序列。
示例 1:
輸入:nums = [10,9,2,5,3,7,101,18]
輸出:4
解釋:最長遞增子序列是 [2,3,7,101],因此長度爲 4 。
示例 2:
輸入:nums = [0,1,0,3,2,3]
輸出:4
示例 3:
輸入:nums = [7,7,7,7,7,7,7]
輸出:1
提示:
1 <= nums.length <= 2500
-104 <= nums[i] <= 104
法一:動態規劃 \(O(n^2)\)
class Solution {
public:
//
int lengthOfLIS(vector<int>& nums) {
int ans = 1;
int nlen = nums.size();
vector<int> dp(nlen, 1);
for(int i = 1; i < nlen; ++i)
{
for (int j = 0; j < i; ++j)
{
if (nums[j] < nums[i]) {
dp[i] = max(dp[i], dp[j] + 1);
}
}
if (ans < dp[i]) {
ans = dp[i];
}
}
return ans;
}
};
法二:動態規劃+二分查找 \(O(nlogn)\)
class Solution {
public:
int lengthOfLIS(vector<int>& nums)
{
int nlen = nums.size();
int ans = 0;
vector<int> tails(nlen, 0);
for(const auto& num : nums)
{
int i = 0, j = ans;
while(i < j)
{
int mid = (i + j) / 2;
if (tails[mid] < num) {
i = mid + 1;
} else {
j = mid;
}
}
tails[i] = num;
if(j == ans) {
ans += 1;
}
}
return ans;
}
};