当前位置: 首页 > article >正文

35.贪心算法2

1.按身高排序(easy)

2418. 按身高排序 - 力扣(LeetCode)

题目解析

算法原理

代码

class Solution {
    public String[] sortPeople(String[] names, int[] heights) {
        // 1. 创建⼀个下标数组
        int n = names.length;
        Integer[] index = new Integer[n];
        for (int i = 0; i < n; i++)
            index[i] = i;
        // 2. 对下标数组排序
        Arrays.sort(index, (i, j) -> {
            return heights[j] - heights[i];
        });
        // 3. 提取结果
        String[] ret = new String[n];
        for (int i = 0; i < n; i++) {
            ret[i] = names[index[i]];
        }
        return ret;
    }
}

2.优势洗牌(田忌赛马)

870. 优势洗牌 - 力扣(LeetCode)

题目解析

算法原理

代码

class Solution {
    public int[] advantageCount(int[] nums1, int[] nums2) {
        int n = nums1.length;
        // 1. 排序
        Arrays.sort(nums1);
        Integer[] index2 = new Integer[n];
        for (int i = 0; i < n; i++)
            index2[i] = i;
        Arrays.sort(index2, (i, j) -> {
            return nums2[i] - nums2[j];
        });
        // 2. ⽥忌赛⻢
        int[] ret = new int[n];
        int left = 0, right = n - 1;
        for (int x : nums1) {
            if (x > nums2[index2[left]]) {
                ret[index2[left++]] = x;
            } else {
                ret[index2[right--]] = x;
            }
        }
        return ret;
    }
}

3.最长回文串(easy)

. - 力扣(LeetCode)

题目解析

算法原理

代码

class Solution {
    public int longestPalindrome(String s) {
        // 1. 计数 - ⽤数组模拟哈希表
        int[] hash = new int[127];
        for (int i = 0; i < s.length(); i++) {
            hash[s.charAt(i)]++;
        }
        // 2. 统计结果
        int ret = 0;
        for (int x : hash) {
            ret += x / 2 * 2;
        }
        return ret < s.length() ? ret + 1 : ret;
    }
}

4.增减字符串匹配(easy)

942. 增减字符串匹配 - 力扣(LeetCode)

题目解析

算法原理

代码

class Solution {
    public int[] diStringMatch(String s) {
        int n = s.length();
        int left = 0, right = n; // ⽤ left,right 标记最⼩值和最⼤值
        int[] ret = new int[n + 1];
        for (int i = 0; i < n; i++) {
            if (s.charAt(i) == 'I') {
                ret[i] = left++;
            } else {
                ret[i] = right--;
            }
        }
        ret[n] = left; // 把最后⼀个数放进去
        return ret;
    }
}

5.分发饼干(easy)

. - 力扣(LeetCode)

题目解析

算法原理

代码

class Solution {
    public int findContentChildren(int[] g, int[] s) {
        // 排序
        Arrays.sort(g);
        Arrays.sort(s);
        // 利⽤双指针找答案
        int ret = 0, m = g.length, n = s.length;
        for (int i = 0, j = 0; i < m && j < n; i++, j++) {
            while (j < n && s[j] < g[i])
                j++; // 找饼⼲
            if (j < n)
                ret++;
        }
        return ret;

    }
}

6.最优除法(medium)

553. 最优除法 - 力扣(LeetCode)

题目解析

算法原理

代码

class Solution {
    public String optimalDivision(int[] nums) {
        int n = nums.length;
        StringBuffer ret = new StringBuffer();
        // 先处理两个边界情况
        if (n == 1) {
            return ret.append(nums[0]).toString();
        }
        if (n == 2) {
            return ret.append(nums[0]).append("/").append(nums[1]).toString();
        }
        ret.append(nums[0]).append("/(").append(nums[1]);
        for (int i = 2; i < n; i++) {
            ret.append("/").append(nums[i]);
        }
        ret.append(")");
        return ret.toString();
    }
}

7.跳跃游戏 Ⅱ(medium)

45. 跳跃游戏 II - 力扣(LeetCode)

题目解析

算法原理

代码

class Solution {
    public int jump(int[] nums) {
        int left = 0, right = 0, ret = 0, maxPos = 0, n = nums.length;
        while (left <= right) // 以防跳不到 n - 1 的位置
        {
            if (maxPos >= n - 1) // 判断是否已经能跳到最后⼀个位置
            {
                return ret;
            }
            for (int i = left; i <= right; i++) {
                // 更新下⼀层的最右端点
                maxPos = Math.max(maxPos, nums[i] + i);
            }
            left = right + 1;
            right = maxPos;
            ret++;
        }
        return -1;
    }
}

8.跳跃游戏(medium)

. - 力扣(LeetCode)

题目解析

算法原理

代码

class Solution {
    public boolean canJump(int[] nums) {
        int left = 0, right = 0, maxPos = 0, n = nums.length;
        while (left <= right) {
            if (maxPos >= n - 1) {
                return true;
            }
            for (int i = left; i <= right; i++) {
                maxPos = Math.max(maxPos, nums[i] + i);
            }
            left = right + 1;
            right = maxPos;
        }
        return false;
    }
}

9.加油站(medium)

. - 力扣(LeetCode)

题目解析

算法原理

 

代码

class Solution {
    public int canCompleteCircuit(int[] gas, int[] cost) {
        int n = gas.length;
        for (int i = 0; i < n; i++) // 依次枚举所有的起点
        {
            int rest = 0; // 统计净收益
            int step = 0;
            for (; step < n; step++) // 枚举向后⾛的步数
            {
                int index = (i + step) % n; // ⾛ step 步之后的下标
                rest = rest + gas[index] - cost[index];
                if (rest < 0) {
                    break;
                }
            }
            if (rest >= 0) {
                return i;
            }
            i = i + step; // 优化
        }
        return -1;
    }
}

10.单调递增的数字(medium)

. - 力扣(LeetCode)

题目解析

算法原理

代码

class Solution {
    public int monotoneIncreasingDigits(int n) {
        // 把数字转化成字符串
        char[] s = Integer.toString(n).toCharArray();
        int i = 0, m = s.length;
        // 找第⼀个递减的位置
        while (i + 1 < m && s[i] <= s[i + 1])
            i++;
        if (i == m - 1)
            return n; // 特判⼀下特殊情况
        // 回退
        while (i - 1 >= 0 && s[i] == s[i - 1])
            i--;
        s[i]--;
        for (int j = i + 1; j < m; j++)
            s[j] = '9';
        return Integer.parseInt(new String(s));
    }
}


http://www.kler.cn/a/312294.html

相关文章:

  • git之 revert和rebase
  • 【C++】详解RAII思想与智能指针
  • Oracle RAC的thread
  • 双十一云服务器抢购后,用SD-WAN连通多云网络
  • AI 大模型如何赋能电商行业,引领变革
  • 基于Python的膳食健康系统
  • [ffmpeg] 视频格式转换
  • 开发板与ubuntu建立网络通信(NFS和TFTP协议搭建)
  • elasticsearch实战应用
  • NAT网络地址转换
  • 【spring】spring框架中使用的设计模式有哪些,经典的设计模式应用,spring框架中哪些地方使用了哪些优秀的设计模式
  • 制作炫酷个人网页:用 HTML 和 CSS3 展现你的风格
  • macos清理垃圾桶时提示 “操作无法完成,因为该项目正在使用中” 解决方法 , 强制清理mac废纸篓 方法
  • 外国药品位置检测系统源码分享
  • 好用的XML解析库——fast-xml-parser
  • 应用案例|开源 PolarDB-X 在互联网安全场景的应用实践
  • YOLOv9改进系列,YOLOv9主干网络替换为RepViT (CVPR 2024,清华提出,独家首发),助力涨点
  • 基于Springboot的无接触外卖配送系统
  • 电风扇制造5G智能工厂物联数字孪生平台,推进制造业数字化转型
  • 35. MyBatis中的缓存失效机制是如何工作的?
  • pytorch入门(1)——pytorch加载数据初认识
  • Nginx:高性能Web服务器与反向代理的深度剖析
  • 契约锁与您相约2024新疆数字经济创新大会暨新疆数字丝路博览会
  • QT支持C/C++工业边缘计算网关带RS485、HDMI视频输出
  • pinia在vue3中的使用
  • 分布式训练:(Pytorch)