算法篇——贪心算法大集合(js版)

news2024/11/26 4:10:34

455.分发饼干

假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。

对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j] 。如果 s[j] >= g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。
链接:https://leetcode.cn/problems/assign-cookies

var findContentChildren = function(g, s) {
    // 匹配到小孩就+1
    var res = 0;
    // 把数组转变为升序,从后往前遍历
    s = s.sort((a, b) => (a - b));
    g = g.sort((a, b) => (a - b));
    // 先满足胃口大的
    for(var i = g.length-1; i >= 0; --i) {
        for(var j = s.length-1; j >= 0; --j) {
            if(s[j] >= g[i]) {
                res++;
                s[j] = -1;
                break;
            }
        }
    }
    return res;
};

376. 摆动序列

如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为 摆动序列 。第一个差(如果存在的话)可能是正数或负数。仅有一个元素或者含两个不等元素的序列也视作摆动序列。

例如, [1, 7, 4, 9, 2, 5] 是一个 摆动序列 ,因为差值 (6, -3, 5, -7, 3) 是正负交替出现的。

相反,[1, 4, 7, 2, 5] 和 [1, 7, 4, 5, 5] 不是摆动序列,第一个序列是因为它的前两个差值都是正数,第二个序列是因为它的最后一个差值为零。
子序列 可以通过从原始序列中删除一些(也可以不删除)元素来获得,剩下的元素保持其原始顺序。给你一个整数数组 nums ,返回 nums 中作为 摆动序列 的 最长子序列的长度 。
链接:https://leetcode.cn/problems/wiggle-subsequence

var wiggleMaxLength = function(nums) {
    // 仅有一个元素
    if(nums.length == 1) return 1;
    // 或者含两个不等元素的序列
    else if(nums.length == 2 && nums[0] != nums[1]) return 2;
    // 作为 摆动序列 的 最长子序列的长度
    var res = 1;
    // 前一个差值
    var preRes = 0;
    // 当前差值
    var curRes = 0;
    for(var i = 0; i < nums.length-1; i++) {
        curRes = nums[i+1] - nums[i];
        if((curRes > 0 && preRes <= 0) || (curRes < 0 && preRes >= 0)) {
            // 向前赋值
            preRes = curRes;
            res++;
        }
    }
    return res;
};

53. 最大子序和

给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

子数组 是数组中的一个连续部分。

链接:力扣

 

var maxSubArray = function(nums) {
    var sum = 0;
    // max 是小于任何数
    var max = -Infinity;
    if(nums.length == 1) return nums[0];
    for(var i = 0; i < nums.length; i++) {
        sum += nums[i];
        if(max < sum) max = sum;
        // 如果加上当前的元素以后,sum 变成0,应该清零重新求和
        if(sum < 0) sum = 0;
    }
    return max;
};

53. 最大子序和

给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。

在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。

返回 你能获得的 最大 利润 。
链接:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-ii

var maxProfit = function(prices) {
    var res = 0;
    // 计算正利润
    var odd = 0;
    for(var i = prices.length-1; i >= 0; i--) {
        // 进行差值计算
        odd = prices[i] - prices[i-1];
        // 如果是正利润就放入结果中
        if(odd > 0) res += odd;
        else odd = 0;
    }
    return res;
};

55. 跳跃游戏

给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。

数组中的每个元素代表你在该位置可以跳跃的最大长度。

判断你是否能够到达最后一个下标。

链接:力扣

 

var canJump = function(nums) {
    if(nums.length == 1) return true;
    // 初始位置下标
    var cover = 0;
    // 最后一个值
    var target = nums.length-1;
    for(var i = 0; i <= cover; i++) {
        cover = Math.max(cover, i + nums[i])
        if(cover >= target) return true;
    }
    return false;
};

45.跳跃游戏II

给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。

每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i + j] 处:

0 <= j <= nums[i] 
i + j < n
返回到达 nums[n - 1] 的最小跳跃次数。生成的测试用例可以到达 nums[n - 1]。
链接:https://leetcode.cn/problems/jump-game-ii

var jump = function(nums) {
    // 需要看这一步和下一步覆盖的范围
    var cur = 0, next = 0, res = 0;
    for(var i = 0; i < nums.length-1; i++) {
        // 取最大覆盖范围
        next = Math.max(nums[i] + i, next);
        if(i == cur) {
            cur = next;
            res++;
        }
    }
    return res;
};

1005.K次取反后最大化的数组和

给你一个整数数组 nums 和一个整数 k ,按以下方法修改该数组:

选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。
重复这个过程恰好 k 次。可以多次选择同一个下标 i 。

以这种方式修改数组后,返回数组 可能的最大和 。
链接:https://leetcode.cn/problems/maximize-sum-of-array-after-k-negations

var largestSumAfterKNegations = function(nums, k) {
    var res = 0;
    sortItem(nums);
    for(var i = 0; i < nums.length; i++) {
        // 负数取反 且 K 还有剩余次数
        if(nums[i] < 0 && k > 0) {
            nums[i] = -nums[i];
            k--; 
        }
        res += nums[i];
    }
    sortItem(nums);
    // 此时k有剩余,说明数组内都是正数
    if(k % 2 > 0) {
        // 因为上面的循环中把所有的元素都加过了
        // 此时应该在取反k次的基础上,再减掉刚刚加的一次
        res -= 2 * nums[0];
    }
    return res;
};
// 转变为升序
var sortItem = (nums) => {
    nums = nums.sort((a, b) => (a-b));
    return nums;
};

134. 加油站

在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。

你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。

给定两个整数数组 gas 和 cost ,如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1 。如果存在解,则 保证 它是 唯一 的。
链接:https://leetcode.cn/problems/gas-station

var canCompleteCircuit = function(gas, cost) {
    // 得到两个数组各自的元素和
    var gasSum = getSum(gas);
    var costSum = getSum(cost);
    var min = Infinity, curSum = 0;
    // 如果gas的总和小于cost的总和,返回-1
    if(gasSum < costSum) return -1;
    // 计算出发节点是0节点还是非0节点
    else {
        var oddList = getOdd(gas, cost);
        // 遍历每个差值找到最小的差值和
        for(var i of oddList) {
            curSum += i;
            if(min > curSum) min = curSum;
        }
        // 如果差值和的最小值是负数,说明从非0节点开始
        if(min < 0) {
            // 如果有节点能填平那个最小差值,就从用来填平的节点开始
            for(var j = gas.length-1; j >= 0; j--) {
                min += oddList[j];
                if(min >= 0) return j;
            }
            // 否则无法实现
            return -1;
        }
        // 如果差值都大于0,说明不缺油,就从0出发
        return 0;
    }
};
// 计算数组各元素的和
var getSum = (list) => {
    var sum = 0;
    for(var i of list) {
        sum += i;
    }
    return sum;
}
// 计算油量差值
var getOdd = (gas, cost) => {
    var oddSum = [];
    for(var i = 0; i < gas.length; i++) {
        var odd = gas[i] - cost[i];
        oddSum.push(odd);
    }
    return oddSum;
}

135. 分发糖果

n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。

你需要按照以下要求,给这些孩子分发糖果:

每个孩子至少分配到 1 个糖果。
相邻两个孩子评分更高的孩子会获得更多的糖果。
请你给每个孩子分发糖果,计算并返回需要准备的 最少糖果数目 。
链接:https://leetcode.cn/problems/candy

var candy = function(ratings) {
    var resList = new Array(ratings.length).fill(1);
    // 从左到右遍历,右边评分比左边大
    for (var i = 1; i < ratings.length; i++) {
        if(ratings[i] > ratings[i-1]) 
            // 比左边的糖果数大 1
            resList[i] = resList[i-1] + 1;
    }
    // 从右到左遍历,左边评分比右边大
    for (var i = ratings.length-2; i >= 0; i--) {
        if(ratings[i] > ratings[i+1]) 
            // 如果本身的糖果数已经比右边的大,则取自身,否则比右边大 1 
            resList[i] = Math.max(resList[i+1] + 1, resList[i]);
    }
    var res = 0;
    for(var i of resList) res += i;
    return res;
};

860.柠檬水找零

在柠檬水摊上,每一杯柠檬水的售价为 5 美元。顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯。

每位顾客只买一杯柠檬水,然后向你付 5 美元、10 美元或 20 美元。你必须给每个顾客正确找零,也就是说净交易是每位顾客向你支付 5 美元。注意,一开始你手头没有任何零钱。

给你一个整数数组 bills ,其中 bills[i] 是第 i 位顾客付的账。如果你能给每位顾客正确找零,返回 true ,否则返回 false 。
链接:https://leetcode.cn/problems/lemonade-change

var lemonadeChange = function(bills) {
    var five = 0, ten = 0;
    for(var i of bills) {
        if(i == 5) five++;
        else if(i == 10) {
            if(five <= 0) return false;
            five--;
            ten++;
        }
        else if(i == 20) {
            if(ten > 0 && five > 0) {
                ten--;
                five--;
            }
            else if(five >= 3) five -= 3;
            else return false;
        }
    }
    return true;
};

406.根据身高重建队列

假设有打乱顺序的一群人站成一个队列,数组 people 表示队列中一些人的属性(不一定按顺序)。每个 people[i] = [hi, ki] 表示第 i 个人的身高为 hi ,前面 正好 有 ki 个身高大于或等于 hi 的人。

请你重新构造并返回输入数组 people 所表示的队列。返回的队列应该格式化为数组 queue ,其中 queue[j] = [hj, kj] 是队列中第 j 个人的属性(queue[0] 是排在队列前面的人)。
链接:https://leetcode.cn/problems/queue-reconstruction-by-height

var reconstructQueue = function(people) {
    // 如果身高高则排前面,如果身高相同则看k值小的在前面
    var people = people.sort((a, b) => 
        (a[0] == b[0]) ? a[1] - b[1] : b[0] - a[0]
    )
    var res = [];
    for(let i = 0; i < people.length; i++) {
        // 按身高高的k来插入
        res.splice(people[i][1], 0, people[i]);
    }
    return res;
};

452. 用最少数量的箭引爆气球

有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points ,其中points[i] = [xstart, xend] 表示水平直径在 xstart 和 xend之间的气球。你不知道气球的确切 y 坐标。

一支弓箭可以沿着 x 轴从不同点 完全垂直 地射出。在坐标 x 处射出一支箭,若有一个气球的直径的开始和结束坐标为 xstart,xend, 且满足  xstart ≤ x ≤ xend,则该气球会被 引爆 。可以射出的弓箭的数量 没有限制 。 弓箭一旦被射出之后,可以无限地前进。

给你一个数组 points ,返回引爆所有气球所必须射出的 最小 弓箭数 。
链接:https://leetcode.cn/problems/minimum-number-of-arrows-to-burst-balloons

var findMinArrowShots = function(points) {
    // 对数组进行升序排序
    points.sort((a, b) => {
        return a[0] - b[0];
    })
    // 至少需要一只箭
    var res = 1;
    // 找最小右边界
    for(var i = 1; i < points.length; i++) {
        // 说明没有重合的半径
        if(points[i][0] > points[i-1][1]) {
            res++;
        }
        // 如果后一个气球的x[start] 比前一个气球的x[end] 小, 说明是最小右边界
        // 它之前的区间需要一只箭
        else {
            points[i][1] = Math.min(points[i][1], points[i-1][1]); 
        }
    }
    return res;
};

435. 无重叠区间 

给定一个区间的集合 intervals ,其中 intervals[i] = [starti, endi] 。返回 需要移除区间的最小数量,使剩余区间互不重叠 。
链接:https://leetcode.cn/problems/non-overlapping-intervals

var eraseOverlapIntervals = function(intervals) {
    intervals.sort((a, b) => {
        return a[1] - b[1];
    })
    // 非移除元素计数器
    var res = 1;
    var end = intervals[0][1]; 
    for(var i = 1; i < intervals.length; i++) {
        // 说明不是重叠区间
        if(intervals[i][0] >= end) {
            res++;
            // end 也要向下一个元素移动
            end = intervals[i][1];
        }
    }
    return intervals.length - res;
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/535619.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue收集表单数据和过滤器

目录 收集表单数据 收集表单数据总结 过滤器 过滤器小结 收集表单数据 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><!--vue--><script src"https://cdn.sta…

【C#】GridControl日期字段显示时分秒

系列文章 【C#】单号生成器&#xff08;编号规则、固定字符、流水号、产生业务单号&#xff09; 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/129129787 【C#】日期范围生成器&#xff08;开始日期、结束日期&#xff09; 本文链接&#xff1a;h…

Vue3+elementPlus 表格提示宽度设置无效问题

网上都说这样改 但是我的改了无效&#xff01; 试了下这样就可以了 <style lang"css">.el-popper {font-size: 14px;max-width: 600px; } </style>

【springboot test】springboot 单元测试配置文件加载顺序及覆盖关系

springboot test 配置文件加载顺序及覆盖关系 参照目录结构:1.配置文件加载基础原则:2.application.yml主配置文件加载原则:3.application.yml中指定spring.profiles.active:xxx时,xxx的加载原则:4.使用ActiveProfiles("yyy")时:5.其他自定义配置文件,如xxx.properti…

为什么需要防雷接地,防雷接地的作用是什么

为什么需要电气接地&#xff1f; 您是否曾经在工作条件下使用任何电器时接触过电击&#xff1f;几乎每个人的答案都是肯定的&#xff0c;有时这些电击是轻微的&#xff0c;但有时会对电气和电子设备造成损坏&#xff0c;并可能危及生命。为防止对人的生命和电器造成任何损害&a…

网络计算模式(一)

CDN网络概念 CDN&#xff1a;Content Delivery Network&#xff0c;即内容分发网络。 其目的是通过在现有的Internet中增加一层新的网络架构&#xff0c;将网站的内容发布到最接近用户的网络“边缘”。使用户可以就近取得所需的内容&#xff0c;解决Internet网络拥挤的状况&a…

盘点十大机器人公众号

原创 | 文BFT机器人 一、机器人大讲堂 公众号定位&#xff1a;引领行业发展的新媒体平台 更新频率&#xff1a;1篇主推3篇副推/每日更新 文章内容&#xff1a; 1. 行业市场新动态&#xff08;常作为主推&#xff09; 吸引关注科技市场动态的客户群体 2. 项目、政策 吸引需…

DI93A HESG440355R3为什么电容器分为多种?只有一种电容器不行吗?

​ DI93A HESG440355R3为什么电容器分为多种&#xff1f;只有一种电容器不行吗&#xff1f; 电子产品由不同的电子元件组成&#xff0c;包括电容器、电感器、电阻器、线圈、发电机等&#xff0c;其中电容器是常见的电子元件。电容器按照类别分为多种电容器&#xff0c;常见的有…

Barra模型因子的构建及应用系列十之Leverage因子

一、摘要 在前期的Barra模型系列文章中&#xff0c;我们构建了Size因子、Beta因子、Momentum因子、Residual Volatility因子、NonLinear Size因子、Book-to-Price因子、Liquidity因子、Earning_Yeild因子和Growth因子 &#xff0c;并分别创建了对应的单因子策略&#xff0c;其…

基于Java的医护人员排班系统设计与实现【附源码】

角色分为管理员、医生、护士 登录、注册页面&#xff1a; 工号、姓名、科室、密码、电话、性别、邮箱 管理员功能&#xff1a; 1、个人中心&#xff1a;个人信息、修改密码。 2、科室信息&#xff1a;增删改查&#xff0c;每个科室要有科室人员。 3、医生信息&#xff1a;增删改…

通过chatGPT学习:L2网络和L3网络?

下面的总结是通过chatGPT4进行的。 1、 L2网络和L3网络 L2网络和L3网络是计算机网络中的两种不同的网络类型&#xff0c;它们有一些不同的特点和应用场景。 L2网络&#xff0c;也被称为数据链路层网络&#xff0c; 主要是通过物理地址&#xff08;MAC地址&#xff09;来转发…

.Net6 导出excel使用aspose.cells23.5.0

一、测试代码 internal class Program { static void Main(string[] args) { WorkbookDesigner wb new WorkbookDesigner(new Workbook()); var style new CellsFactory().CreateStyle(); style.Borders.SetColor(C…

计算机视觉——day 92 基于跨领域协作学习的单图像去雨

基于跨领域协作学习的单图像去雨 1. Introduction3. Proposed method3.1 网络架构 4. Experiments and results4.1 数据集和指标4.3 合成图像的结果4.8 建模复杂度和运行时间 5. Conclusion 1. Introduction 深度卷积神经网络(DCNN)在图像解析任务中取得了优异的性能。然而&am…

量化投资 无套利 No-arbitrage

文章目录 量化投资 无套利 No-arbitrageState of Nature市场域 Market Span 套利 Arbitrage无套利和正线性定价规则 No-arbitrage and Positive Linear Pricing RuleImplication 1: One-price PrincipleImplication 2: PositivityImplication 3: AdditivityImplication 4: Homo…

QGIS Desktop与QGIS Server 下载安装

QGIS是一款开源的地理信息系统软件&#xff0c;全称为Quantum GIS。它提供了一系列强大的GIS功能&#xff0c;可以用于浏览、编辑、分析和处理各种地理空间信息。QGIS支持多种矢量、栅格和数据库数据格式&#xff0c;包括ESRI Shapefile、GeoJSON、GML、PostGIS、Oracle Spatia…

基于Kubernetes集群构建大中型企业CICD应用平台(8)--通过jenkins把从远程拉取的代码推送执行其他主机上,然后进行镜像打包并进行部署

一、配置Maven构建代码 代码拉取到Jenkins本地后&#xff0c;需要在Jenkins中对代码进行构建&#xff0c;这里需要Maven的环境&#xff0c;而Maven需要Java的环境&#xff0c;接下来需要在Jenkins中安装JDK和Maven&#xff0c;并且配置到Jenkins服务。 - 准备JDK、Maven压缩包…

Appuploader 常见错误及解决方法

转载&#xff1a;Appuploader 常见错误及解决方法 Appuploader是一款用于上传、管理和分享iOS应用的客户端工具。使用Appuploader可以让您更加便捷地管理和分享您的应用程序&#xff0c;同时也能够提高工作效率。本文将介绍一些常见的Appuploader错误及其解决方法。 1.登录失…

软考算法-算法篇

软考算法 一&#xff1a;故事背景二&#xff1a;分治法2.1 概念2.2 题目描述2.3 代码实现2.4 总结提升 三&#xff1a;回溯法3.1 概念3.2 题目描述3.3 代码实现3.3.1 TreeNode 类3.3.2 将数组处理成二叉树结构并且返回根节点3.3.3 进行搜索 3.4 总结提升 四&#xff1a;回溯法-…

【数据分析之道-Matplotlib(四)】Matplotlib散点图

文章目录 专栏导读1、Matplotlib散点图语法2、Matplotlib散点图设置图标大小3、Matplotlib散点图自定义点颜色4、Matplotlib散点图设置两组散点图5、Matplotlib散点图使用随机数来设置散点图6、Matplotlib散点图显示颜色条 Colormap 专栏导读 ✍ 作者简介&#xff1a;i阿极&…

Github Copilot Chat的规则泄露,详细分析这31条规则

GitHub Copilot 是一款由 GitHub 和 OpenAI 共同开发的人工智能编程助手。它是一种基于机器学习的代码自动完成工具&#xff0c;旨在帮助开发人员更高效地编写代码。 GitHub Copilot Chat是GitHub Copilot的一部分&#xff0c;它是一个基于人工智能的编程助手&#xff0c;由Op…