两道面试中的算法题

给出随机数列[-1,2,4,-5,0,2,4,6,9,-3,2],其最长单调递增数列是[0,2,4,6,9],写出算法。

 

#include <stdio.h>
// 该算法是我根据我草稿和答卷上的伪代码翻译的 编译运行看到的结果和我想的一样。
void get_longest_incr_array(int data[],int len) {

	int current_length = 1;
	int current_base = 0;
	int max_length = 1;
	int max_base = 0;

	for(int i = 1; i < len; i++ ) {
		if(data[i]>data[i-1]) {
			current_length += 1;
			if(current_length > max_length) {
				max_base = current_base;
				max_length = current_length;
			}
		} else {
			current_length = 1;
			current_base = i;
		}
	}
	printf("%d, %dn",max_base,max_length); // max_base是数组最长单调递增子序列的起始点,max_length是该序列的长度
};

int main(int argc, char *argv[])
{
	int test[14] = {5,4,1,2,3,4,5,6,1,2,5,3,2,1}; // 1,2,3,4,5,6
	get_longest_incr_array(test,14);

	int test2[14] = {0,2,1,2,1,1,3,5,7,9,10,11,12,14}; // 1,3,5,7,9,10,11,12,14
	get_longest_incr_array(test2,14);
	return 0;
}

设有M*N矩阵

0,1,0,0,0,0,0,1,0,0
1,1,1,0,1,0,0,0,0,1
0,0,1,0,1,0,0,0,1,1
0,0,0,0,1,0,0,0,0,0
规则:有连续1的块算一个大块,例如上述矩阵有4个,求通用解法
【想了很久被面试官提示用递归寻找连续1块,继续想了很久得出最终解法  】

#include <stdio.h>

int search_big_block(int *data,int m, int n,int index_x,int index_y) {
	if ( *(data+index_x*n+index_y) == 0 )
	{
		return 0;
	} else {
		*(data+index_x*n+index_y) = 0; // 顺便置为0 如此递归下次寻找便不会找到这里来了
		if(index_x > 0){
			search_big_block(data,m,n,index_x-1,index_y);
		}
		if(index_x < m){
			search_big_block(data,m,n,index_x+1,index_y);
		}
		if(index_y > 0){
			search_big_block(data,m,n,index_x,index_y-1);
		}
		if(index_y < n){
			search_big_block(data,m,n,index_x,index_y+1);
		}
		return 1;
	}
}

int main(int argc, char *argv[])
{
	int data[] = {
		0,1,0,0,0,0,0,1,0,0,
		1,1,1,0,1,0,0,0,0,1,
		0,0,1,0,1,0,0,0,1,1,
		0,0,0,0,1,0,0,0,0,0
	};

	int control = 0;
	for(int i=0;i < 4;i++) {
		for(int j=0;j < 10;j++) {
			if (search_big_block(data,4,10,i,j))
			{
				control += 1;
			}
		}
	}
	printf("%d",control);
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值