算法奇妙屋(三十五)-贪心算法学习之路 2

文章目录

一. 力扣 376. 摆动序列

1. 题目解析

题目这里看一眼图片就能理解

2. 算法原理

看下面图解, 最后一个值不会被计算上, 所有将ret初始值赋值为1

3. 代码

java 复制代码
class Solution {
    public int wiggleMaxLength(int[] nums) {
        int left = 0;
        int ret = 1;
        for (int i = 0; i < nums.length - 1; i++) {
            int right = nums[i + 1] - nums[i];
            if (right == 0) {
                continue;
            }
            if (left * right <= 0) {
                ret++;
                left = right;
            }
        }
        return ret;
    }
}

二. 力扣 300. 最长递增子序列

1. 题目解析

算法奇妙屋(十九)-子序列问题(动态规划)这篇博客中我们使用动态规划解决过这道题, 这里不过多赘述题目

2. 算法原理

贪心算法需要动态规划和二分查找的铺垫, 这里我们是根据示例, 下标从头到尾一步步模拟的, 制作不易~

回忆动态规划

贪心算法主体

3. 代码

java 复制代码
class Solution {
    public int lengthOfLIS(int[] nums) {
        int tail = 1;
        int n = nums.length;
        int[] dp = new int[n];
        dp[0] = nums[0];
        for (int i = 1; i < n; i++) {
            if (nums[i] > dp[tail - 1]) {
                dp[tail++] = nums[i];
                continue;
            }
            int left = 0;
            int right = tail - 1;
            while (left < right) {
                int mid = left + (right - left) / 2;
                if (dp[mid] < nums[i]) {
                    left = mid + 1;
                }else {
                    right = mid;
                }
            }
            if (nums[i] < dp[left]) {
                dp[left] = nums[i];
            }
        }
        return tail;
    }
}

三. 力扣 334. 递增的三元子序列

1. 题目解析

这道题和上道题(最长递增子序列)十分相似, 就只多了个条件, 长度为3时, 返回true

2. 算法原理

这里和上道题的算法原理基本一致, 这里直接copy

3. 代码

java 复制代码
class Solution {
    public boolean increasingTriplet(int[] nums) {
        int n = nums.length;
        if (n < 3) {
            return false;
        }
        int[] dp = new int[3];
        int tail = 1;
        dp[0] = nums[0];
        for (int i = 1; i < n; i++) {
            int left = 0;
            int right = tail - 1;
            if (dp[tail - 1] < nums[i]) {
                dp[tail++] = nums[i];
            }else {
                while (left < right) {
                    int mid = (left + right) / 2;
                    if (dp[mid] < nums[i]) {
                        left = mid + 1;
                    }else {
                        right = mid;
                    }
                }
            }
            if (tail == 3) {
                return true;
            }
            if (nums[i] < dp[left]) {
                dp[left] = nums[i];
            }
            
        }
        return false;
    }
}

四. 力扣 674. 最长连续递增序列

1. 题目解析

最长递增子序列的更简单版本, 这里是子数组

2. 算法原理

3. 代码

java 复制代码
class Solution {
    public int findLengthOfLCIS(int[] nums) {
        int ret = 0;
        int n = nums.length;
        for (int i = 0; i < n;) {
            int j = i + 1;
            while (j < n && nums[j] > nums[j - 1]) {
                j++;
            }
            ret = Math.max(ret, j - i);
            i = j;
        }
        return ret;
    }
}
相关推荐
代码探秘者2 小时前
【算法篇】3.位运算
java·数据结构·后端·python·算法·spring
Aaswk2 小时前
回溯算法的本质理解
c语言·算法·leetcode·力扣·剪枝
迷海2 小时前
力扣原题《分发糖果》,采用二分原则,纯手搓,待验证
c++·算法·leetcode
`Jay2 小时前
Python Redis连接池&账号管理池
redis·分布式·爬虫·python·学习
玛卡巴卡ldf2 小时前
【LeetCode 手撕算法】(普通数组)53-最大子数组和、56-合并区间、189-轮转数组、238-除了自身以外数组的乘积
数据结构·算法·leetcode
red_redemption2 小时前
自由学习记录(146)
学习
j_xxx404_2 小时前
蓝桥杯基础--模拟
数据结构·c++·算法·蓝桥杯·排序算法
Sakinol#2 小时前
Leetcode Hot 100 ——动态规划part02
算法·leetcode·动态规划
sqyno1sky2 小时前
零成本抽象在C++中的应用
开发语言·c++·算法