力扣Hot100每日N题(15~16)

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;
    }
}
### LeetCode Hot 100 编程问及解决方案概述 LeetCode Hot 100 是一份精选的编程目列表,广泛被用于算法学习和面试准备。这些问涵盖了多种数据结构和算法类型,包括但不限于数组、链表、字符串、树、图、动态规划等。 #### 常见型与解法 - **两数之和 (Two Sum)** 给定一个整数数组 `nums` 和一个目标值 `target`,请你在该数组中找出和为目标值的那两个整数,并返回它们的数组下标。 解决方案可以使用哈希表来实现 $O(n)$ 的时间复杂度: ```cpp vector<int> twoSum(vector<int>& nums, int target) { unordered_map<int, int> map; for (int i = 0; i < nums.size(); ++i) { int complement = target - nums[i]; if (map.find(complement) != map.end()) { return {map[complement], i}; } map[nums[i]] = i; } return {}; } ``` - **最长有效括号 (Longest Valid Parentheses)** 给定一个只包含字符 `'('` 和 `')'` 的字符串,计算其中有效括号子串的最大长度。 可以使用栈或动态规划的方法来解决此问。例如,使用栈的方式可以遍历字符串并维护栈中的索引,从而找到最长的有效括号序列 [^1]。 - **搜索旋转排序数组 (Search in Rotated Sorted Array)** 假设按照升序排序的数组在某个关键点上进行了旋转(例如 `[0,1,2,4,5,6,7]` 变成了 `[4,5,6,0,1,2]`),给定一个目标值,请判断是否存在该值。 使用二分查找策略,通过比较中间元素和左右边界的值来调整搜索范围。 - **组合总和 (Combination Sum)** 给定一个无重复元素的数组 `candidates` 和一个目标数 `target`,找出所有满足条件的唯一组合:这些数字的加和等于目标值且每个数字可以无限制重复使用。 此问通常使用回溯法解决,递归地尝试所有可能的组合路径。 - **接雨水 (Trapping Rain Water)** 给定一个非负整数数组 `height`,表示一个高程图,计算它可以存储多少单位的雨水。 可以使用双指针方法或者预处理左右最大高度数组来优化计算,确保线性时间复杂度。 #### 数据结构与算法的应用 - **栈** 栈常用于处理括号匹配、表达式求值等问。例如,“字符串解码”可以通过栈来解析嵌套的编码结构 [^2]。 - **排序与双指针** 在“两数之和”的变体中,可以利用排序后使用双指针技巧快速定位符合条件的元素对 [^3]。 - **动态规划** 许多 LeetCode Hot 100 目涉及动态规划,如“最大子数组和”、“不同路径”、“编辑距离”等。动态规划的核心是定义状态转移方程,并逐步填充 DP 表。 - **滑动窗口** 对于连续子数组相关的问,如“最小覆盖子串”、“无重复字符的最长子串”,滑动窗口是一种高效的解决方案。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值