博客记录-day149-力扣

一、力扣

1、最长连续序列

128. 最长连续序列

注意是遍历集合!!!否则会超时

java 复制代码
class Solution {
    public int longestConsecutive(int[] nums) {
        int ans = 0;
        Set<Integer> st = new HashSet<>();
        for (int num : nums) {
            st.add(num); // 把 nums 转成哈希集合
        }
        for (int x : st) { // 遍历哈希集合
            if (st.contains(x - 1)) {
                continue;
            }
            // x 是序列的起点
            int y = x + 1;
            while (st.contains(y)) { // 不断查找下一个数是否在哈希集合中
                y++;
            }
            // 循环结束后,y-1 是最后一个在哈希集合中的数
            ans = Math.max(ans, y - x); // 从 x 到 y-1 一共 y-x 个数
        }
        return ans;
    }
}

2、分发饼干

455. 分发饼干

java 复制代码
class Solution {
    public int findContentChildren(int[] g, int[] s) {
        Arrays.sort(s);
        Arrays.sort(g);
        int point=0,traget=0;
        for(int i=0;i<s.length&&traget<g.length;i++){
            if(s[i]>=g[traget]){
                traget++;
                point++;
            }
        }
        return point;
    }
}

3、买卖股票的最佳时机 II

122. 买卖股票的最佳时机 II

贪心做法,相邻两天只要有利润,就进行交易

java 复制代码
class Solution {
    public int maxProfit(int[] prices) {
        int ans = 0;
        int n = prices.length;
        for (int i = 1; i < n; ++i) {
            ans += Math.max(0, prices[i] - prices[i - 1]);
        }
        return ans;
    }
}

4、摆动序列

376. 摆动序列

1. 贪心

java 复制代码
class Solution {
    public int wiggleMaxLength(int[] nums) {
        // 处理特殊情况:数组长度为0或1时,直接返回长度
        if (nums.length <= 1) {
            return nums.length;
        }
        // 当前差值(当前元素与前一个元素的差)
        int curDiff = 0;
        // 上一个有效差值(记录波峰或波谷的变化方向)
        int preDiff = 0;
        // 计数器,初始为1,因为至少有一个元素
        int count = 1;
        for (int i = 1; i < nums.length; i++) {
            curDiff = nums[i] - nums[i - 1];
            // 当当前差值与上一个有效差值符号相反时,说明出现摆动
            // 注意:当preDiff为0时(初始状态或连续相等情况),只要当前差值非0即视为有效摆动
            if ((curDiff > 0 && preDiff <= 0) || (curDiff < 0 && preDiff >= 0)) {
                count++;
                preDiff = curDiff; // 更新上一个有效差值
            }
        }
        return count;
    }
}

2. 动态规划

java 复制代码
class Solution {
    public int wiggleMaxLength(int[] nums) {
        // dp[i][0]表示以nums[i]为波峰时的最长摆动子序列长度
        // dp[i][1]表示以nums[i]为波谷时的最长摆动子序列长度
        int[][] dp = new int[nums.length][2];
        // 初始化:每个元素自身至少可以构成长度为1的子序列
        for(int i=0;i<nums.length;i++){
            Arrays.fill(dp[i],1);
        }

        for (int i = 1; i < nums.length; i++) {

            // 遍历所有可能的j < i,更新状态
            for (int j = 0; j < i; j++) {
                if (nums[j] > nums[i]) {
                    // 当前元素nums[i]比nums[j]小,可作为波谷
                    // 取nums[j]作为波峰时的最长长度,并加上当前元素
                    dp[i][1] = Math.max(dp[i][1], dp[j][0] + 1);
                } else if (nums[j] < nums[i]) {
                    // 当前元素nums[i]比nums[j]大,可作为波峰
                    // 取nums[j]作为波谷时的最长长度,并加上当前元素
                    dp[i][0] = Math.max(dp[i][0], dp[j][1] + 1);
                }
                // 若nums[j] == nums[i],不影响状态,无需处理
            }
        }

        // 最终结果取最后一个元素作为波峰或波谷的最大值
        return Math.max(dp[nums.length - 1][0], dp[nums.length - 1][1]);
    }
}

5、最大子数组和

53. 最大子数组和

dpi为以numsi结尾的最大子数组和。

java 复制代码
class Solution {
    public int maxSubArray(int[] nums) {
        int res=nums[0];
        int n=nums.length;
        int[] dp=new int[n];
        dp[0]=res;
        for(int i=1;i<n;i++){
            dp[i]=nums[i]+Math.max(0,dp[i-1]);
            res=Math.max(dp[i],res);
        }
        return res;
    }
}
java 复制代码
class Solution {
    public int maxSubArray(int[] nums) {
        if (nums.length == 1){
            return nums[0];
        }
        int sum = Integer.MIN_VALUE;
        int count = 0;
        for (int i = 0; i < nums.length; i++){
            count += nums[i];
            sum = Math.max(sum, count); // 取区间累计的最大值(相当于不断确定最大子序终止位置)
            if (count <= 0){
                count = 0; // 相当于重置最大子序起始位置,因为遇到负数一定是拉低总和
            }
        }
       return sum;
    }
}

6、跳跃游戏

55. 跳跃游戏

java 复制代码
class Solution {
    public boolean canJump(int[] nums) {
        int n=nums.length;
        int nexright=0;
        for(int i=0;i<n;i++){
            if(i<=nexright){
                nexright=Math.max(nexright,i+nums[i]);
            }else{
                return false;
            }
        }
        return true;
    }
}
相关推荐
逛逛GitHub5 分钟前
不要错过这 18 个本周 YYDS 的 GitHub 开源项目。
github
大刚测试开发实战12 分钟前
TestHub数据工厂发布!附更新指南
前端·后端·github
在水一缸16 分钟前
深度解析:GitHub “虚假星星“ 经济链与开源信任危机
开源·github·技术选型·虚假星星·信任危机·灰色产业链
2601_9618451537 分钟前
行测电子版pdf教材|真题|解析
pdf·新媒体运营·github·个人开发·内容运营·规格说明书·极限编程
我最爱吃鱼香茄子41 分钟前
【保姆级】Git配置用户名和邮箱(全局/局部)解决提交记录不识别、贡献图不亮问题
git·gitee·github·小白教程·git配置·程序员开发工具
yyuuuzz44 分钟前
云服务器软件部署的常见问题与经验
linux·运维·服务器·网络·数据库·人工智能·github
码流怪侠1 小时前
【GitHub】 Headroom 深度解析:AI Agent 上下文压缩层的完整技术拆解
人工智能·github·agent
Appoint_x1 小时前
我受够了浏览器标签越开越乱,所以做了一个「标签工作台」
github
夫唯不争,故无尤也1 小时前
安全协作:私有仓库的正确共享方式
安全·github·多人协作
Safeploy安策数据1 小时前
政务云加密太慢?万兆服务器密码机如何破解高并发性能瓶颈
linux·运维·github