本文已参与「新人创作礼」活动,一起开启掘金创作之路。
题目
1748.唯一元素的和
题目大意
给你一个整数数组 nums 。数组中唯一元素是那些只出现 恰好一次 的元素。
请你返回 nums 中唯一元素的 和 。
样例
数据规模
思路
使用进行标记,遍历所有的,同时进行计数,最后遍历的所有元素,如果数量为1,则加上该元素,最后返回即可。
代码
class Solution {
public:
int sumOfUnique(vector<int>& nums) {
map<int,int>mp;
for(auto it:nums){
mp[it]++;
}
int ans=0;
for(auto it:mp){
if(it.second==1){
ans+=it.first;
}
}
return ans;
}
};
题目
1219.黄金矿工
题目大意
你要开发一座金矿,地质勘测学家已经探明了这座金矿中的资源分布,并用大小为 m * n 的网格 grid 进行了标注。每个单元格中的整数就表示这一单元格中的黄金数量;如果该单元格是空的,那么就是 0。
为了使收益最大化,矿工需要按以下规则来开采黄金:
- 每当矿工进入一个单元,就会收集该单元格中的所有黄金。
- 矿工每次可以从当前位置向上下左右四个方向走。
- 每个单元格只能被开采(进入)一次。
- 不得开采(进入)黄金数目为
0的单元格。 - 矿工可以从网格中 任意一个 有黄金的单元格出发或者是停止。
样例
数据规模
思路
设为网格的行数,为网格的列数,并且由数据可以发现。那么可以直接考虑回溯算法。只要就说明它可以作为起点,然后开始。枚举所有的路径,并且每次更新。每次的步骤:
- 由传入的参数来更新答案,最大化。
- 枚举下一个位置,可以走上下左右四个方向。保证下一个位置之前没有到达过(没有被标记过)并且
- 之后进行回溯,标记取消。
代码
class Solution {
public:
int ans=0,n,m;
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
int vis[20][20];
void dfs(int x,int y,int w,vector<vector<int>>& grid){
ans=max(ans,w);
for(int i=0;i<4;i++){
int nex=x+dx[i],ney=y+dy[i];
if(nex>=0&&nex<=n-1&&ney>=0&&ney<=m-1&&grid[nex][ney]&&!vis[nex][ney]){
vis[nex][ney]=1;
dfs(nex,ney,w+grid[nex][ney],grid);
vis[nex][ney]=0;
}
}
}
int getMaximumGold(vector<vector<int>>& grid) {
n=grid.size(),m=grid[0].size();
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(grid[i][j])
vis[i][j]=1;
dfs(i,j,grid[i][j],grid);
vis[i][j]=0;
}
}
return ans;
}
};