122. 交易股票的最佳机会 II
122. 交易股票的最佳机会 IIhttps://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. 跳跃游戏https://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<=cover
- for(i = 0; i <= cover; ++i) {
- // 更新cover为从i出发能到达的最大值/cover的值中较大值
- cover = max(i + nums[i], cover);
- // 若更新后cover可以到达最后的元素,返回true
- if(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;
- }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |