首页 > 其他分享 >代码随想录训练营day29|134.加油站,135. 分发糖果,860.柠檬水找零,406.根据身高重建队列

代码随想录训练营day29|134.加油站,135. 分发糖果,860.柠檬水找零,406.根据身高重建队列

时间:2024-08-26 22:53:00浏览次数:14  
标签:ratings vector return int money 随想录 candy 柠檬水 找零

加油站

想法:暴力遍历?

好吧第一遍写的时候读错题意了,以为是比较gas[i]与cost[i+1]的值,shit。

int sum1=0,sum2=0;
for(int g:gas)
     sum1+=g;
 for(int c:cost)
     sum2+=c;
 if(sum1<sum2)
     return -1;
  //如果gas没cost多
  
 int youliang=0;
 int n=gas.size();
 
 for(int i=0;i<n;i++){
     int count=0;
     youliang=0;//每一次要记得重置
 
     for(int j=i;count<n;count++){
          if(j==n)
             j=0;//用来解决循环
         youliang+=gas[j];
         if(youliang>=cost[j]){
             youliang-=cost[j];
             j++;
         }
         else
         	break;
     
     if(count==n)
         return i;
 }
 return -1;

但这样碰到大数据时会超时。
如果从i开始到j处不满足,那从i+1处必然时不满足的,因为i处是在积累油量,这个想法就和之前求最大连续子数组和一样,直接果断舍弃,让i=j,然后下一次i++,就从下一处开始

分发糖果

好吧,这题我确实没啥思路。。。
这是力扣上的官解给出的:
我们可以将「相邻的孩子中,评分高的孩子必须获得更多的糖果」这句话拆分为两个规则,分别处理。
左规则:当 ratings[i−1]<ratings[i] 时,i 号学生的糖果数量将比 i−1 号孩子的糖果数量多。
右规则:当 ratings[i]>ratings[i+1] 时,i 号学生的糖果数量将比 i+1 号孩子的糖果数量多。
代码倒是不难写,主要这思路好难想

		vector<int> candy(ratings.size());
        candy[0]=1;
        for(int i=1;i<ratings.size();i++){
            if(ratings[i]>ratings[i-1]){
                candy[i]=candy[i-1]+1;
            }
            else
                candy[i]=1;
        }
        for(int i=ratings.size()-2;i>=0;i--){
            if(ratings[i]>ratings[i+1]){
                candy[i]=max(candy[i],candy[i+1]+1);
            }
            
        }
        int sum=0;
        for(int cd:candy){
            sum+=cd;
        }
        return sum;
    }

vector的初始化

如果一开始写的是vector candy;没给大小,那就不能用candy[0]来赋值,只能push_back来加元素。
或者写成vector candy(ratings.size());

柠檬水找零

这道还挺简单,我是用map来记录面额,收下一张就++;

 		unordered_map<int,int> money;
        for(int i=0;i<bills.size();i++){
            money[bills[i]]++;
            if(bills[i]==10){
                if(money[5]!=0){
                    money[5]--;
                }
                else
                    return false;
            }
            else if(bills[i]==20){
                if(money[10]>=1&&money[5]>=1){
                    money[5]--;
                    money[10]--;
                }
                else if(money[10]==0&&money[5]>=3){
                    money[5]-=3;
                }
                
                else 
                    return false;
            }
        }
        return true;
    }

406.根据身高重建队列

先找到最矮的一个人,然后他的second就是他重建后的位置,因为其他人都比他高。

好吧看来理解的还是不够深刻,面对两个维度的问题,一定要先考虑一个在考虑另一个,如果两个维度一起考虑一定会顾此失彼。
这题的思路是先按身高排序,而且要是从大往小排,这样就只用再根据有k个比他高的人在他前面考虑了。
要自己手写排序方式

static bool cmp(vector<int> a,vector<int>b){
	if(a[0]==b[0]){
		return a[1]<b[1];
	]
	return a[0>b[0];

}

sort 排序 return a < b 就是 从小到大; return a > b 就是 从大到小

堆 排序 return a < b 就是大顶堆 ; return a > b 就是小顶堆
在这里插入图片描述

 		sort(people.begin(),people.end(),cmp);
        vector<vector<int>> queue;
        for(int i=0;i<people.size();i++){
            int position=people[i][1];
            queue.insert(queue.begin()+position,people[i]);
        }

标签:ratings,vector,return,int,money,随想录,candy,柠檬水,找零
From: https://blog.csdn.net/wwwgxd/article/details/141501791

相关文章

  • 「代码随想录算法训练营」第四十七天 | 图论 part5
    目录并查集模板107.寻找存在的路径并查集模板原理:并查集主要有两个功能:将两个元素添加到一个集合中。判断两个元素在不在同一个集合。模板代码:intn=1005;//n根据题目中节点数量而定,一般比节点数量大一点就好vector<int>father=vector<int>(n,0);//C++里的......
  • 代码随想录day41 || 121 买卖股票最佳时机,122 买卖股票最佳时机||,123 买卖股票最佳时
    121买卖股票最佳时机funcmaxProfit(prices[]int)int{ //dp五部曲 //1dp数组以及下标含义dp[i][0]表示第i天持有股票dp[i][1]表示第i天不持有 //2递推公式,dp[i][0]=max(dp[i-1][0],0-price[i]) //dp[i][1]=max(dp[i-1][1],dp[i-1][0]+price[......
  • 代码随想录DAY24 - 回溯算法 - 08/23
    目录分割回文串题干思路和代码递归法复原IP地址题干思路和代码子集(非重复)题干思路和代码方法一:修改子集大小方法二:收集树的每个节点子集Ⅱ(含重复)题干思路和代码方法一:先去重,记录每个元素重复的次数方法二:先排序,再树层去重使用unordered_set对树层去重......
  • 代码随想录DAY25 - 回溯算法 - 08/24
    目录非递减子序列题干思路和代码递归法递归优化全排列题干思路和代码递归法全排列Ⅱ题干思路和代码方法一:用集合set去重方法二:先排序,再用数组去重非递减子序列题干题目:给你一个整数数组nums,找出并返回所有该数组中不同的递增子序列,递增子序列中至少有......
  • 代码随想录第15天,110.平衡二叉树,257. 二叉树的所有路径, 404.左叶子之和, 222.完全二叉
    110.平衡二叉树//平衡二叉树,理解稍微有点难度#include<iostream>#include<algorithm>//Forstd::absandstd::maxfunctionsstructTreeNode{intval;TreeNode*left;TreeNode*right;TreeNode(intx):val(x),left(nullptr),right(nullptr......
  • 代码随想录第16天:513.找树左下角的值、112. 路径总和、106.从中序与后序遍历序列构造
    513.找树左下角的值,层序遍历//找树左下角的值,用层序遍历很容易实现#include<iostream>#include<queue>structTreeNode{intval;TreeNode*left;TreeNode*right;TreeNode(intx):val(x),left(nullptr),right(nullptr){}};//找到最底层......
  • 代码随想录day39 || 198 打家劫舍,213 打家劫舍||,337 打家劫舍|||
    198打家劫舍funcrob(nums[]int)int{ //思路,动态规划 //dp[i]代表前下标为i能装的最大盗窃物品价值 //递推dp[i]=max(dp[i-1],dp[i-2]+v(i))//dp[i-1]代表不偷物品i,dp[i-2]+v(i)代表偷物品i,那么就不能偷i-1,因为题目要求不能相邻,所以考虑前i-2 //dp[0]=0,......
  • 「代码随想录算法训练营」第四十五天 | 图论 part3
    目录101.孤岛的总面积DFS思路BFS思路102.沉没孤岛103.水流问题104.建造最大岛屿101.孤岛的总面积题目链接:https://kamacoder.com/problempage.php?pid=1173文章讲解:https://programmercarl.com/kamacoder/0101.孤岛的总面积.html题目状态:看题解DFS思路思路:代码结构......
  • 代码随想录Day24
    93.复原IP地址有效IP地址正好由四个整数(每个整数位于0到255之间组成,且不能含有前导0),整数之间用'.'分隔。例如:"0.1.2.201"和"192.168.1.1"是有效IP地址,但是"0.011.255.245"、"192.168.1.312"和"[email protected]"是无效IP地址。给定一个只包含数字的字符串s......
  • 代码随想录算法训练营第 50 天 |98. 所有可达路径
    代码随想录算法训练营Day50代码随想录算法训练营第50天|98.所有可达路径目录代码随想录算法训练营前言LeetCode98.所有可达路径一、图论基础概念1、图的种类2、度3、连通性:节点的连通情况4、图的构造5、图的遍历方式二、深度优先搜索1、深度优先搜索的三部曲2......