zoukankan      html  css  js  c++  java
  • LeetCode--贪心算法

    1、有N个孩子站成一排。 为每个孩子分配一个评级值。
    您正在为这些孩子提供糖果,符合以下要求:
    每个孩子必须至少有一个糖果。
    评分较高的儿童获得的糖果多于邻居。
    你必须给予的最低糖果是多少?

    思路:

    首先从左到右依次遍历,若右边小孩的评分高于左边,则右边的小朋友得到的糖果比左边小朋友得到的多1个

    然后,在从最右边的小朋友依次向左边的小朋友遍历,若左边的小朋友的评分大于右边的小朋友,且右边的小朋友得到的糖果大于他左边的小朋友,则左边的小朋友糖果比右边的小朋友多1个

    class Solution {
    public:
        int candy(vector<int> &ratings) {
            int n = ratings.size();
            if(n<=1) return n;
            //初始将每个孩子的糖果数都设为1
            vector<int> num(n,1);
            int sum=0;
            //从左向右扫描,保证一个方向上分数更大的糖果更多
            for(int i=1;i<n;i++)
                if(ratings[i]>ratings[i-1]) num[i]=num[i-1]+1;
            //从右向左扫描,保证另一个方向上分数更大的糖果更多
            for(int i=n-2;i>=0;i--)
                if(ratings[i]>ratings[i+1] && num[i]<=num[i+1]) num[i]=num[i+1]+1;
            for(int i=0;i<n;i++)
                sum += num[i];
            return sum;
        }
    };

    2、沿着环形路线有N个加油站,其中站i的气体量是gas[i]。
    你有一辆装有无限油箱的汽车,从车站i到下一站(i + 1)需要花费cost[i]气。 您可以在其中一个加油站开始使用空罐。
    如果您可以在环形路线行驶一次,则返回起始加油站的索引,否则返回-1。

    思路:

    令环形公路的最后一站为汽车的起始站,则下一站必定为环形公路的第一站,汽车每行驶一站,则剩下的油应为上一站剩下的油和这一站剩余油的总和,若该总和大于0,则可以开始行驶下一站,若油不够,则汽车的初始车站将变更,即始点为终点

    class Solution {
    public:
        int canCompleteCircuit(vector<int> &gas, vector<int> &cost) {
            int n = gas.size();
            int start = n-1;
            int end = 0;
            int sum = gas[start] - cost[start];
            while(start > end){
                if(sum>=0){
                    sum += gas[end] - cost[end];
                    ++end;
                }else{
                    --start;
                    sum += gas[start] - cost[start];
                }
            }
            return sum>=0 ? start:-1;
        }
    };

    3、给定一个非负整数数组,您最初定位在数组的第一个索引处。
    数组中的每个元素表示该位置的最大跳转长度。
    您的目标是以最小跳跃次数到达最后一个索引。
    例如:
    给定数组A = [2,3,1,1,4]
    到达最后一个索引的最小跳转次数是2。 (Jump1step从索引0到1,然后3步到最后一个索引。)

    class Solution {
    public:
        int jump(int A[], int n) {
            int jumps = 0, curEnd = 0, curFarthest = 0;
            for (int i = 0; i < n - 1; i++) {
                curFarthest = max(curFarthest, i + A[i]);
                if (i == curEnd) {
                    jumps++;
                    curEnd = curFarthest;
                }
            }
            if(curEnd < n-1) //判断一下有没有到达数组的尾部位置
                jumps = 0;
            return jumps;
        }
    };
  • 相关阅读:
    MySQL基准测试--innodb_buffer_pool_instances
    MySQL参数优化:back_log
    MySQL open_files_limit相关设置
    Django权限系统auth模块详解
    2.9 go mod 之本地仓库搭建
    my40_MySQL锁概述之意向锁
    my39_InnoDB锁机制之Gap Lock、Next-Key Lock、Record Lock解析
    2.8 GO 参数传递
    my38_MySQL事务知识点零记
    my37_MGR流控对数据库性能的影响以及MGR与主从的性能对比
  • 原文地址:https://www.cnblogs.com/zhuifeng-mayi/p/11155719.html
Copyright © 2011-2022 走看看