36.贪心算法3

1.坏了的计算器(medium)

. - 力扣(LeetCode)

题目解析

算法原理

代码

class Solution {
    public int brokenCalc(int startValue, int target) {
        // 正难则反 + 贪⼼
        int ret = 0;
        while (target > startValue) {
            if (target % 2 == 0)
                target /= 2;
            else
                target += 1;
            ret++;
        }
        return ret + startValue - target;
    }
}

2.合并区间(medium)

56. 合并区间 - 力扣(LeetCode)

题目解析

算法原理

 

 

代码

class Solution {
    public int[][] merge(int[][] intervals) {
        // 1. 按照左端点排序
        Arrays.sort(intervals, (v1, v2) -> {
            return v1[0] - v2[0];
        });
        // 2. 合并区间 - 求并集
        int left = intervals[0][0], right = intervals[0][1];
        List<int[]> ret = new ArrayList<>();
        for (int i = 1; i < intervals.length; i++) {
            int a = intervals[i][0], b = intervals[i][1];
            if (a <= right) // 有重叠部分
            {
                // 合并 - 求并集
                right = Math.max(right, b);
            } else // 不能合并
            {
                ret.add(new int[] { left, right });
                left = a;
                right = b;
            }
        }
        // 别忘了最后⼀个区间
        ret.add(new int[] { left, right });
        return ret.toArray(new int[0][]);
    }
}

3.无重叠区间(medium)

### 贪心算法的正确描述分析 贪心算法是一种在求解问题时采取局部最优选择的策略。它并不保证每一步的选择都能得到全局最优解,但在某些特定问题中可以有效获得最优解或较优解。 #### A. 贪心算法是设计算法的一种方法论 该描述是正确的。贪心算法作为一种算法设计方法论,其核心思想是在每一步都选择当前状态下最优的解决方案,通过局部最优解逐步构建全局解。贪心算法广泛应用于最优化问题中,例如区间调度、图的最小生成树等问题。这种方法论具有清晰的逻辑结构和广泛的应用场景[^1]。 #### C. 贪心算法并不能保证得到最优解 该描述是正确的。贪心算法的一个显著特征是它并不总能保证最终结果是最优解。例如在某些图的最短路径问题中,贪心策略可能选择当前看来最优的路径,但最终结果却不是全局最优解。这表明贪心算法的有效性依赖于问题本身的性质,如是否具有贪心选择性质和最优子结构[^3]。 #### D. 贪心算法是最优化问题的一种,求解问题时,其他最优化方法能解决的问题,贪心算法不一定能解决 该描述是正确的。贪心算法是解决最优化问题的一种方法,但它并不适用于所有最优化问题。例如,动态规划能够处理具有最优子结构性质的问题,并通过自底向上的方式求解复杂问题,而贪心算法则依赖于局部最优选择。因此,某些问题可以通过动态规划等方法解决,但贪心算法无法有效处理[^1]。 ### 示例代码:区间不相交问题的贪心实现 以下是一个使用贪心算法解决区间不相交问题的示例代码: ```c #include <stdio.h> #include <stdlib.h> typedef struct { int start; int end; } Interval; // 比较函数,用于排序区间 int compare(const void *a, const void *b) { Interval *intervalA = (Interval *)a; Interval *intervalB = (Interval *)b; return intervalA->end - intervalB->end; } int main() { Interval intervals[] = {{1, 3}, {2, 4}, {3, 5}, {6, 7}}; int n = sizeof(intervals) / sizeof(intervals[0]); // 按照结束时间排序 qsort(intervals, n, sizeof(Interval), compare); int count = 1; int lastEnd = intervals[0].end; for (int i = 1; i < n; i++) { if (intervals[i].start >= lastEnd) { count++; lastEnd = intervals[i].end; } } printf("最多可以选择 %d 个不相交区间。\n", count); return 0; } ``` 此代码通过贪心策略选择结束时间最早的区间,从而最大化可选的不相交区间数量。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值