1748.唯一元素的和 & 1219.黄金矿工

150 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

题目

1748.唯一元素的和

题目大意

给你一个整数数组 nums 。数组中唯一元素是那些只出现 恰好一次 的元素。

请你返回 nums 中唯一元素的

样例

image-20220206194109168

数据规模

image-20220206194117674

思路

使用mapmap进行标记,遍历所有的numsnums,同时进行计数,最后遍历mapmap的所有元素,如果数量为1,则ansans加上该元素,最后返回ansans即可。

代码

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 的单元格。
  • 矿工可以从网格中 任意一个 有黄金的单元格出发或者是停止。

样例

image-20220205143629387

数据规模

image-20220205143638271

思路

nn为网格的行数,mm为网格的列数,并且由数据可以发现1<=n,m<=151<=n,m<=15。那么可以直接考虑回溯算法。只要grid[i][j]>0grid[i][j]>0就说明它可以作为起点,然后开始dfs+回溯dfs+回溯。枚举所有的路径,并且每次更新ans=max(ans,w)ans=max(ans,w)。每次dfsdfs的步骤:

  • dfsdfs传入的参数ww来更新答案ansans,最大化ansans
  • 枚举下一个位置(nex,ney)(nex,ney),可以走上下左右四个方向。保证下一个位置之前没有到达过(visvis没有被标记过)并且grid[nex][ney]>0grid[nex][ney]>0
  • dfsdfs之后进行回溯,visvis标记取消。

代码

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;
    }
};