輸入:n =5, edges =[[0,1],[2,1],[3,1],[1,4],[2,4]]
輸出:[0,2,3]
解釋:注意到節點 0,3 和 2 無法從其他節點到達,
所以我們必須將它們包含在結果點集中,這些點都能到達節點 1 和 4 。提示:
2<= n <=10^51<= edges.length <=min(10^5, n *(n -1)/2)
edges[i].length ==20<= fromi, toi < n
所有點對 (fromi, toi) 互不相同。
解題:
檢查入度為0的節點
classSolution{public:vector<int>findSmallestSetOfVertices(int n, vector<vector<int>>& edges){vector<int>indegree(n,0), ans;for(auto& e : edges){indegree[e[1]]++;}for(int i =0; i < n; i++){if(indegree[i]==0)ans.push_back(i);}return ans;}};
classSolution{public:intminOperations(vector<int>& nums){int s =0, maxn =0;for(int i =0; i < nums.size();++i){maxn =max(maxn, nums[i]);}for(int i =0; i < nums.size();++i){while(nums[i]){if(nums[i]&1)//不能整除{s++;//調用nums[i]--;}else{nums[i]/=2;}}}while(maxn>1)//大于1時{maxn /=2;//最大的數能被2除的次數s++;}return s;}};
188 ms 25.5 MB
4. LeetCode 5482. 二維網格圖中探測環 hard
題目鏈接
給你一個二維字符網格數組 grid ,大小為 m x n ,你需要檢查 grid 中是否存在 相同值 形成的環。
輸入:grid =[["a","b","b"],["b","z","b"],["b","b","a"]]
輸出:false提示:
m == grid.length
n == grid[i].length
1<= m <=5001<= n <=500
grid 只包含小寫英文字母。
解題:
dfs 記錄訪問標記,以及走過的 steps
classSolution{vector<vector<int>> dir ={{1,0},{0,1},{-1,0},{0,-1}};bool found =false;int m, n;public:boolcontainsCycle(vector<vector<char>>& grid){m = grid.size(), n = grid[0].size();int i, j, k, x, y;vector<vector<bool>>visited(m, vector<bool>(n,false));vector<vector<int>>step(m, vector<int>(n,0));for(i =0; i < m;++i){for(j =0; j < n;++j){if(found)return found;if(visited[i][j])continue;visited[i][j]=true;step[i][j]=1;//走過的步數dfs(i,j,step,visited,grid);}}return found;}voiddfs(int i,int j,vector<vector<int>>&step, vector<vector<bool>>&visited, vector<vector<char>>& grid){int x,y,k;if(found)return;for(k =0; k <4; k++){x = i + dir[k][0];y = j + dir[k][1];if(x >=0&& x < m && y >=0&& y < n){if(grid[x][y]!= grid[i][j])continue;//不相同的值,不行if(!visited[x][y])//沒有訪問{visited[x][y]=true;step[x][y]= step[i][j]+1;//步數+1dfs(x, y, step, visited, grid);}else{//訪問過了,且當前步數跟其步數差滿足條件if(step[i][j]-step[x][y]+1>=4){found =true;return;}}}}}};