代码随想录算法训练营第51期第28天 | 122. 买卖股票的最佳时机 II、55. 跳跃游戏、45. 跳跃游戏 II、1005.K次取反后最大化的数组和

ops/2024/12/26 8:59:37/

122. 买卖股票的最佳时机 II

122. 买卖股票的最佳时机 IIicon-default.png?t=O83Ahttps://leetcode.cn/problems/best-time-to-buy-and-sell-stock-ii/1.我刚刚看了一下之前用C++写题的时候,自己说了句【我好像记得这道题是怎么写的,也不知道是福是祸】会心一笑,好像不是坏事,过了这么久了,我还是记得,说明我会呀

2.很简单哈,就是搜集区间为正数的每日收入,加起来就行了,有一说一,这个是不是画个坐标系,然后统计每个上升区间的差值就可以了

int maxProfit(int* prices, int pricesSize) {int res = 0;for (int i = 1; i < pricesSize; i++) {// int money = *(prices + i) - *(prices + i - 1);int money = prices[i] - prices[i-1];if (money > 0) {res += money;}}return res;
}

55. 跳跃游戏

55. 跳跃游戏icon-default.png?t=O83Ahttps://leetcode.cn/problems/jump-game/1.有点尴尬,看之前的blog的时候,不小心看到范围两个字,好吧,我知道怎么写了

2.这题的关键在于覆盖范围,当覆盖范围达到数组长度的时候,就是返回true的时候了,一旦没有达到覆盖范围,则return false

3.我把卡哥的代码也放进来,我觉得更简洁一些

贪心算法局部最优解:每次取最大跳跃步数(取最大覆盖范围),整体最优解:最后得到整体最大覆盖范围,看是否能到终点

bool canJump(int* nums, int numsSize) {int range = *nums;int tmp = 0;for (int i = 1; i < numsSize; i++) {if (i <= range) {tmp = nums[i] + i;if (tmp > range) {range = tmp;if (range > numsSize -1){return true;}}}else{return false;}}return true;
}#define max(a, b) (((a) > (b)) ? (a) : (b))bool canJump(int* nums, int numsSize){int cover = 0;int i;// 只可能获取cover范围中的步数,所以i<=coverfor(i = 0; i <= cover; ++i) {// 更新cover为从i出发能到达的最大值/cover的值中较大值cover = max(i + nums[i], cover);// 若更新后cover可以到达最后的元素,返回trueif(cover >= numsSize - 1)return true;}return false;
}

45. 跳跃游戏 II

1.打眼一看,这道题应该用动态规划会更好做一点,但是tm的我现在记不得动态规划的写法了;

2.参考文心一言的写法,懂的很舒服

3.看了一言的写法,dp也可以,无非是没有贪心高效罢了

int jump(int* nums, int numsSize) {int jumps = 0;  // 跳跃次数int currentEnd = 0;  // 当前跳跃范围的结束位置int farthest = 0;  // 在当前跳跃范围内能够到达的最远点for (int i = 0; i < numsSize - 1; i++) {  // 遍历到倒数第二个元素farthest = (farthest > i + nums[i]) ? farthest : i + nums[i];  // 更新最远点if (i == currentEnd) {  // 到达当前跳跃范围的边界jumps++;  // 进行一次新的跳跃currentEnd = farthest;  // 更新跳跃范围的结束位置为当前能够到达的最远点if (currentEnd >= numsSize - 1) {  // 如果已经能够跳到最后一个元素或更远break;  // 提前终止循环}}}return jumps;
}

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

1.觉得这道题很简单,但是怎么想都没有想出来,就是在k还没遍历完,但是所有数都是正数了,怎么处理?

2.看了一下解说,两次贪心,两次排序,茅塞顿开 !!!第一次贪心:让绝对值大的负数变正数;第二次贪心:排序之后,找数值最小的正整数进行反转

int cmp(const void* a, const void* b) {int inta = *(int *)a;int intb = *(int *)b;return inta - intb;
}
int largestSumAfterKNegations(int* nums, int numsSize, int k) {qsort(nums, numsSize, sizeof(int), cmp);int res = 0;for (int i = 0; i < numsSize; i++) {if (nums[i] < 0 && k > 0){nums[i] = -nums[i];k--;}res += nums[i];}qsort(nums, numsSize, sizeof(int), cmp);if (k % 2 == 1) {res = res - nums[0] * 2;}return res;
}


http://www.ppmy.cn/ops/145078.html

相关文章

活力笔记:一款让你的灵感永不落幕的应用

今天我要向大家介绍一个超级酷炫的项目——VividNote&#xff08;活力笔记&#xff09;。它不仅仅是一个简单的笔记应用&#xff0c;更像是你口袋里的创意伙伴。想象一下&#xff0c;如果你能随时随地捕捉那些一闪而过的灵感&#xff0c;并将它们整理成有序的知识库&#xff0c…

Web 漏洞之 CSRF 漏洞挖掘:攻防深度剖析

目录 一、引言 二、CSRF 漏洞的概念 三、攻击者视角下的 CSRF 漏洞挖掘与利用 &#xff08;一&#xff09;攻击原理与条件 &#xff08;二&#xff09;漏洞分类及利用方式 &#xff08;三&#xff09;漏洞发现手法 &#xff08;四&#xff09;高级应用场景及绕过方法 四…

第6章 图论

2024年12月25日一稿 &#x1f430;6.1 图的基本概念 6.1.1 图的定义和表示 6.1.2 图的同构 6.1.3 完全图与正则图 6.1.4 子图与补图 6.1.5 通路与回路 6.2 图的连通性 6.2.1 无向图的连通性 6.2.2 有向图的连通性 6.3 图的矩阵表示 6.3.1 关联矩阵 6.3.2 有向图的邻接矩阵…

C++进阶-1-单继承、多继承、虚继承

C单继承详解 1. 基础概念 继承是面向对象编程中的一个核心概念&#xff0c;允许一个类&#xff08;子类或派生类&#xff09;继承另一个类&#xff08;父类或基类&#xff09;的属性和方法。单继承意味着一个类只能直接继承一个父类。这种简单的结构在许多情况下是足够的&…

鲸鱼机器人和乐高机器人的比较

鲸鱼机器人和乐高机器人各有其独特的优势和特点&#xff0c;家长在选择时可以根据孩子的年龄、兴趣、经济能力等因素进行综合考虑&#xff0c;选择最适合孩子的教育机器人产品。 优势 鲸鱼机器人 1&#xff09;价格亲民&#xff1a;鲸鱼机器人的产品价格相对乐高更为亲民&…

Flutter 实现文本缩放学习

Flutter 如何实现一个简单的文本缩放应用程序&#xff0c;其中包含一个可以增加或减少文本大小的功能。 前置知识点学习 TextScaler TextScaler 是一个用于控制文本缩放的工具或机制&#xff0c;不过需要注意的是&#xff0c;TextScaler 并不是 Flutter 框架中内置的类。在 …

腾讯云云开发 Copilot具有以下优势

与其他代码生成工具相比&#xff0c;腾讯云云开发 Copilot具有以下优势&#xff1a; 功能特性方面 自然语言处理能力更强&#xff1a;许多代码生成工具仅能实现简单的代码补全或根据特定模板生成代码&#xff0c;而云开发 Copilot可直接通过自然语言生成完整的小程序/web全栈…

Android U 多任务启动分屏——system_server流程(更新中)

前文 Android U 多任务启动分屏——SystemUI流程 前文说到Transitions的startTransition方法中&#xff0c;通过mOrganizer.startNewTransition(type, wct);提交WindowContainerTransaction相关事务到system_server侧&#xff0c;继续跟踪其流程。 system_server侧分屏处理流…