算法-贪心算法

这篇具有很好参考价值的文章主要介绍了算法-贪心算法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

题目:给定一个字符串str,只由‘X’和‘.’两种字符构成。‘X’表示墙,不能放灯,也不需要点亮‘.’表示居民点,可以放灯,需要点亮如果灯放在i位置,可以让i-1,i和i+1三个位置被点亮返回如果点亮str中所有需要点亮的位置,至少需要几盏灯

思路:递归方式,每个位置两种情况,不选择或者选择(当前必须是 '.'),如果是选择,记录当前位置。边界条件为当前位置超过字符串长度,遍历整个数组,检查是否有不合规的位置,如果没有返回当前递归组合中灯个数。递归方法返回从当前位置开始直到最后位置最少灯数量

public static int fun240808(String line){
        // PC
        if(line == null || line.length()<=0)
            return 0;
        char[] arr = line.toCharArray();
        return process240808(arr,0,new HashSet<>());
    }
    // 返回从index开始到line末尾点亮所有最少灯光
    public static int process240808(char[] line, int index, HashSet<Integer> pos){
        if(index >=line.length){
            // pos 当前递归各灯组合
            for (int i = 0; i < line.length; i++) {
                if(line[i]  != 'X'){
                    // 当前递归组合存在未覆盖完全的场景,无效组合
                    if(!pos.contains(i-1) && !pos.contains(i)&& !pos.contains(i+1)){
                        return Integer.MAX_VALUE;
                    }
                }
            }
            return pos.size();
        }
        int no = process240808(line,index+1,pos);
        int yes = Integer.MAX_VALUE;
        if(line[index] == '.'){
            pos.add(index);
            yes = process240808(line,index+1,pos);
            pos.remove(index);
        }
        return Math.min(yes,no);
    }

思路2:贪心算法

public static int getlights(String line){
        // PC
        // cur之前及时有灯也无法覆盖cur位置,也即cur之前所有灯能覆盖位置后的第一个灯的位置
        int count = 0 ;
        for (int i = 0; i < line.length(); i++) {
            if(line.charAt(i) == '.'){
                count++;
                i = i+1<line.length() && line.charAt(i+1) == '.'?i+2:i+1;
            }
        }
        return count;
    }

一块金条切成两半,是需要花费和长度数值一样的铜板的。 比如长度为20的金条,不管怎么切,都要花费20个铜板。 一群人想整分整块金条,怎么分最省铜板? 例如,给定数组{10,20,30},代表一共三个人,整块金条长度为60,金条要分成10,20,30三个部分。 如果先把长度60的金条分成10和50,花费60; 再把长度50的金条分成20和30,花费50;一共花费110铜板。 但如果先把长度60的金条分成30和30,花费60;再把长度30金条分成10和20, 花费30;一共花费90铜板。 输入一个数组,返回分割的最小代价。

思路:递归方式,当前数组两两组合,得到新数组以及累加和,重复递归,直到数组长度为1

public static int fun240209(int[] arr){
        if(arr == null || arr.length<=0)
            return 0;
        return process240209(arr,0);
    }
    // pre 之前各种组合得到的金额
	// arr 当前遍历数组
    public static int process240209(int[] arr,int pre){
        if(arr.length == 1){
            return pre;
        }
        int min = Integer.MAX_VALUE;
        for(int i = 0;i<arr.length;i++){
            for(int j = i+1;j<arr.length;j++){
                // 递归调用合并完的数组
                min = Math.min(min,process240209(merge240209(arr,i,j),pre+arr[i]+arr[j]));
            }
        }
        return min;
    }
// 原有数组两两合并后得到新的数组
    public static int[] merge240209(int[] arr,int i,int j){
        int[] ans = new int[arr.length - 1];
        int index = 0;
        for (int k = 0; k < arr.length; k++) {
            if(k == j || k == i)
                continue;
            ans[index++] = arr[k];
        }
        ans[index] = arr[i]+arr[j];
        return ans;
    }

思路2 哈夫曼树

public static int fun2240209(int[] arr){
        // PC 参数校验
        if(arr == null || arr.length<=0)
            return 0;
        PriorityQueue<Integer> queue = new PriorityQueue<>();
        for (int i = 0; i < arr.length; i++) {
            queue.add(arr[i]);
        }
        int ans = 0;
        while (queue.size()>1){
            // 将最小两个数合并
            int sum = queue.poll()+queue.poll();
            ans += sum;
            queue.add(sum);
        }
        return ans;
    }

题目:输入: 正数数组costs、正数数组profits、正数K、正数M costs[i]表示i号项目的花费 profits[i]表示i号项目在扣除花费之后还能挣到的钱(利润) K表示你只能串行的最多做k个项目 M表示你初始的资金 说明: 每做完一个项目,马上获得的收益,可以支持你去做下一个项目。不能并行的做项目。 输出:你最后获得的最大钱数。

思路:贪心法文章来源地址https://www.toymoban.com/news/detail-831625.html

// 贪心法 当前资金能做的项目,从这些项目里面拿出收益最大的,更新当前资金,重复上面操作,直到遍历完成k次或者所有做完所有项目收益资金都无法满足
    // 剩余的项目
    public static int getMaxMoney(int K, int W, int[] Profits, int[] Capital) {
        PriorityQueue<Project> minCost = new PriorityQueue<>();
        PriorityQueue<Project> maxProfit = new PriorityQueue<>();
        // 初始化mincost
        for (int i = 0; i < Profits.length; i++) {
            minCost.add(new Project(Capital[i],Profits[i]));
        }

        for (int i = 0; i < K; i++) {
            while (!minCost.isEmpty() && minCost.peek().cost<=W){
                maxProfit.add(minCost.poll());
            }
            if(maxProfit.isEmpty()){
                return W;
            }
            W += maxProfit.poll().profit;
        }
        return W;
    }
    static class Project{
        private int cost;
        private int profit;
        public Project(int cost,int profit){
            this.cost = cost;
            this.profit = profit;
        }
    }

到了这里,关于算法-贪心算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 贪心算法part03算法

    ● 1005.K次取反后最大化的数组和 ● 134. 加油站 ● 135. 分发糖果 https://leetcode.cn/problems/maximize-sum-of-array-after-k-negations/description/ https://leetcode.cn/problems/gas-station/description/ https://leetcode.cn/problems/candy/description/

    2024年01月18日
    浏览(44)
  • 【算法】贪心算法练习一

    个人主页 : zxctscl 如有转载请先通知 一、贪心策略:解决问题的策略,局部最优-全局最优 把解决问题的过程分为若干步; 解决每一步的时候,都选择当前看起来“最优的”解法; 希望得到全局最优。 二、贪心策略的正确性 因为有可能“贪心策略”是一个错误的方法 正确

    2024年04月25日
    浏览(70)
  • 18. 算法之贪心算法

    贪心算法(greedy algorithm,又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,算法得到的是在某种意义上的局部最优解。下面,我们详细介绍。 贪婪算法(Greedy)的定义: 是一种在每一步选中都采取在当前状态

    2024年02月09日
    浏览(33)
  • 算法之贪心算法

    定义 总是做出当前最好的选择,期望通过局部最优选择得到全局最优的解决方案。 适用标准 贪心选择性质。 原问题的整体最优解可以通过一系列局部最优的选择得到。这种选择依赖于已做出的选择,不依赖于未做出的选择。贪心算法解决的问题,在程序运行过程中无回溯过

    2024年02月08日
    浏览(33)
  • 算法小课堂(五)贪心算法

    贪心算法是一种常见的算法思想,用于解决优化问题。其基本思想是在每一步选择中都采取当前状态下最优的选择,从而希望能够获得全局最优解。 具体来说,贪心算法通常分为以下步骤: 定义问题的最优解,通常需要将问题转化为求最大值或最小值; 选择一个局部最优解

    2024年02月02日
    浏览(40)
  • C++算法之贪心算法

    贪心算法是一种求解最优解问题的算法,它的核心思想是每一步都采取当前状态下最优的选择,从而最终得到全局最优解。它是C++重要的一种算法。下面会介绍贪心算法。 目录 1.步骤 1.2 例 2.框架 3.例题 3.1 删数问题 13  3.2 接水问题 (1)确定问题的最优子结构:问题的最优

    2024年01月21日
    浏览(41)
  • 算法设计方法之贪心算法

    贪心算法是算法设计的一种方法。期盼通过每个阶段的局部最优选择,从而达到全局的最优。但结果不一定是最优的。 场景一 零钱兑换 现有硬币 1 元、2 元、5 元,需要用最少的硬币数量凑够 11 元。 利用贪心算法实现,优先考虑最好的结果就是面值为 5 元的硬币,11 = 5 +

    2024年02月17日
    浏览(41)
  • 贪心算法(贪婪算法)

    贪心算法(贪婪算法) 贪心算法思想 ​ 1.贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说, 不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解 。 ​ 2.贪心选择是指所求问题的 整体最优解可以通过一系列局部

    2024年02月03日
    浏览(44)
  • 计算机算法贪心算法

    贪心算法(Greedy Algorithm)是一种常见的算法思想,它在每一步选择当前状态下最优的解决方案,从而希望最终能够达到全局最优解。 贪心算法的基本思路是每一步都选择当前状态下的局部最优解,而忽略了当前选择所带来的影响,因此并不一定能够得到全局最优解。然而,

    2024年02月02日
    浏览(48)
  • 贪心算法part01 算法

    ● 理论基础 ● 455.分发饼干 ● 376. 摆动序列 ● 53. 最大子序和 https://leetcode.cn/problems/assign-cookies/description/ https://leetcode.cn/problems/wiggle-subsequence/description/ https://leetcode.cn/problems/maximum-subarray/description/

    2024年02月02日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包