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

124. 二叉树中的最大路径和

class Solution {
    int ans = Integer.MIN_VALUE;
    public int maxPathSum(TreeNode root) {
        dfs(root);
        return ans;
    }
    public int dfs(TreeNode root){
        if(root == null) return 0;
        int l = Math.max(0, dfs(root.left));
        int r = Math.max(0, dfs(root.right));
        ans = Math.max(ans, l + r + root.val);
        return Math.max(l, r) + root.val;
    }
}

322. 零钱兑换

class Solution {
    int[] dp;
    public int coinChange(int[] coins, int amount) {
        dp = new int[amount + 1];
        Arrays.fill(dp, amount + 1);
        // coins = Arrays.stream(coins)
        //     .boxed()
        //     .sorted((a, b) -> b - a)
        //     .mapToInt(Integer::intValue)
        //     .toArray();
        System.out.println(Arrays.toString(coins));
        dp[0] = 0;
        for(int i = 0; i <= amount; i++){
            for(int coin : coins){
                if(coin <= amount - i) 
                    dp[coin + i] = Math.min(dp[coin + i], dp[i] + 1);
            }
        }
        return dp[amount] == amount + 1 ? -1 : dp[amount];
    }
}

494. 目标和

class Solution {
    int ans = 0;
    void dfs(int[] nums, int idx, int res, int target){
        if(idx == nums.length){
            if(res == target) ans++;
            return ;
        }
        dfs(nums, idx + 1, res + nums[idx], target);
        dfs(nums, idx + 1, res - nums[idx], target);
    }
    public int findTargetSumWays(int[] nums, int target) {
        dfs(nums, 0 , 0, target);
        return ans;
    }
}

461. 汉明距离

class Solution {
    public int hammingDistance(int x, int y) {
        int z = x ^ y, ans = 0;
        while(z > 0){
            ans += z & 1;
            z >>= 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 表。 - **滑动窗口** 对于连续子数组相关的问,如“最小覆盖子串”、“无重复字符的最长子串”,滑动窗口是一种高效的解决方案。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值