155. 最小栈
class MinStack {
private Deque<Integer> st;
private Deque<Integer> minSt;
public MinStack() {
st = new LinkedList<>();
minSt = new LinkedList<>();
}
public void push(int val) {
st.offerLast(val);
if(!minSt.isEmpty()) minSt.offerLast(Math.min(val, getMin()));
else minSt.offerLast(val);
}
public void pop() {
st.removeLast();
minSt.removeLast();
}
public int top() {
return st.peekLast();
}
public int getMin() {
return minSt.peekLast();
}
}
/**
* Your MinStack object will be instantiated and called as such:
* MinStack obj = new MinStack();
* obj.push(val);
* obj.pop();
* int param_3 = obj.top();
* int param_4 = obj.getMin();
*/
152. 乘积最大子数组
动态规划版
class Solution {
public int maxProduct(int[] nums) {
int n = nums.length, ans = nums[0];
int ma = nums[0], mi = nums[0];
for(int i = 1; i < n; i++){
int x = ma*nums[i], y = mi*nums[i];
ma = Math.max(nums[i], Math.max(x, y));
mi = Math.min(nums[i], Math.min(x, y));
ans = Math.max(ans, ma);
}
return ans;
}
}
贪心版
区间一定不会包含0(除非全0)
枚举每个不包含0的区间即可
class Solution {
public int maxProduct(int[] nums) {
int ans = Integer.MIN_VALUE, pre = 1, suf = 1, n = nums.length;
for(int i = 0, j = n-1; i < n; i++, j--){
pre *= nums[i];
suf *= nums[j];
ans = Math.max(Math.max(ans, nums[i]), Math.max(pre, suf));
if(nums[i] == 0) pre = 1;
if(nums[j] == 0) suf = 1;
}
return ans;
}
}