基础算法学习

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/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值