赞
踩
1.二叉树的层次遍历
描述
给定一个二叉树,返回该二叉树层序遍历的结果,(从左到右,一层一层地遍历)
示例
输入:{1,2,3,4,#,#,5}
返回值:[[1],[2,3],[4,5]]
题解:递归(前序遍历)
主要思路:前序遍历,中、左、右
左边的节点一定先于右边节点遍历到,加入至对应的数组中,满足层序遍历的要求;
要点:
1、利用一个level变量标记当前递归的深度,将节点的值push到当前深度的数组的后面;
2、level变量大于res数组的size,说明第一次进入二叉树本层,对res扩容;
//前序遍历模板,前序遍历得到二叉树的层次遍历; struct TreeNode{ int val; TreeNode* left; TreeNode* right; TreeNode(int val1,TreeNode *l = NULL,TreeNode *r = NULL){//构造函数 val = val1; left = l; right = r; } }; void f(TreeNode* root,int level,vector<vector<int>> &res){ if(!root)return ; if(level>=res.size()){//最新的深度,申请一个数组存储; res.push_back(vector<int> {}); } res[level].push_back(root->val); f(root->left,level+1,res);//遍历左子树; f(root->right,level+1,res);//遍历右子树; } vector<vector<int> > levelOrder(TreeNode* root) { // write code here vector<vector<int>> res;//存储最终结果; f(root,0,res);//前序遍历; return res;//返回结果; }
2.岛屿的数量
描述
给一个01矩阵,1代表是陆地,0代表海洋, 如果两个1相邻,那么这两个1属于同一个岛。我们只考虑上下左右为相邻。
岛屿: 相邻陆地可以组成一个岛屿(相邻:上下左右) 判断岛屿个数。
示例
输入:[[1,1,0,0,0],[0,1,0,1,1],[0,0,0,1,1],[0,0,0,0,0],[0,0,1,1,1]]
返回值:3
DFS:
从一个为1的根节点开始访问,从每个相邻1节点向下访问到顶点(周围全是水),依次访问其他相邻1节点到顶点,其中找到一个1就岛屿标志加一,通过递归遍历将此岛屿的周围是1的全部赋予0,再开始遍历下一个岛屿,直到遍历整个地图没有岛屿“1”为止。
//岛屿的数量 void dfs(char[][] grid, int r, int c) { int nr = grid.length; int nc = grid[0].length; if (r < 0 || c < 0 || r >= nr || c >= nc || grid[r][c] == '0') { return; } grid[r][c] = '0';//将周围1的都设置为0 dfs(grid, r - 1, c); dfs(grid, r + 1, c); dfs(grid, r, c - 1); dfs(grid, r, c + 1); } int solve(char[][] grid) { if (grid == NULL || grid.length == 0) { return 0; } int nr = grid.length;//行列 int nc = grid[0].length; int num_islands = 0; for (int r = 0; r < nr; ++r) { for (int c = 0; c < nc; ++c) { if (grid[r][c] == '1' ) {//寻找1 num_islands++; dfs(grid, r, c);//行列,将周围的1都设置为0,设置好了之后再寻找下一个岛屿,也就是不相邻的1 } } } return num_islands; }
3.最大数
描述:给定一个nums数组由一些非负整数组成,现需要将他们进行排列并拼接,每个数不可拆分,使得最后的结果最大,返回值需要是string类型,否则可能会溢出
提示:
1 <= nums.length <= 100
0 <= nums[i] <= 10000
示例
输入:[2,20,23,4,8]
返回值:“8423220”
设计思想:
这道题题目己经提示,输出用字符串的形式了,所以我们第一步就是把整数数组变为字符串数组,第二步就是将字符串数组排序,排序规则就是:每次将相邻的两个字符申正反拼接,然后比大小,从而确定相邻的两个字符申是否交换位置。还有一个细节就是如果排序好的数组第一个元素就是”0”,那么结果直接返回字符串”0”就好了,如果排序好后的数组第一个元素不是”0”,那么直接从头到尾拼接返回就好了。字符串拼接就是字符串相加。
//最大数 //定义一个排序规则 static bool cmp(string a,string b){ return a + b > b + a; } string solve(vector<int>& nums) { vector<string> ve; //将整型的数字转化为字符串 for(int i = 0;i < nums.size();i ++){ ve.push_back(to_string(nums[i])); } //排序 sort(ve.begin(),ve.end(),cmp);//cmp排序规则,利用此排序规则就可以得到拼接顺序 //这个地方需要注意如果第一个字符串已经是0了,那么直接输出0 if(ve[0] == "0") return "0"; string res =""; //结果字符串 for(int i = 0;i < ve.size();i ++){//字符串相加就是将字符串拼接起来。 res += ve[i];//将排序好后的字符串一次相加就是最终的结果 } return res; }
来源https://www.nowcoder.com/
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。