class Solution {
public:
int maxProduct(vector<int>& nums) {
// 一看就是动态规划
int f = nums[0], g = nums[0], res = nums[0];
for(int i = 1; i < nums.size(); i++)
{
int a = nums[i], fa = f * a , ga = g * a;
f = max(a, max(fa, ga));
g = min(a, min(fa, ga));
res = max(res, f);
}
return res;
}
};
153 - 寻找旋转排序数组中的最小值
实际上这两个题和前面的 33, 34 是一样的,甚至还简化了
class Solution {
public:
int findMin(vector<int>& nums) {
// 和之前的题很像诶 二分找分界线
int k = nums[0];
int l = 0, r = nums.size() - 1;
while(l < r)
{
int mid = l + r >> 1;
if(nums[mid] < k) r = mid;
else l = mid + 1;
}
return min(nums[0], nums[l]);
}
};
154 - 寻找旋转排序数组中的最小值II
同样的, 也是把后面和nums[0]相等的部分提前删去就好了
class Solution {
public:
int findMin(vector<int>& nums) {
int l = 0, r = nums.size() - 1;
while(l < r && nums[l] == nums[r]) r--;
// 二分
while(l < r)
{
int mid = l + r >> 1;
if(nums[mid] < nums[0]) r = mid;
else l = mid + 1;
}
return min(nums[0], nums[l]);
}
};