贪心算法入门
例题
【字节面试】 题目描述:
现有一个长花坛,有一部分已经种了花,还有一部分空出来,现在有n个刚刚到货的花需要种在花坛里,要求两盆花不能相邻。问n盆花能否在已有的花坛中种完?
例:
输入:parterre[]{0,0,1,0,1,0,0,0,1,0,0} n = 3; //0代表没有花,1代表已经种花
输出:True //可以种到0,6,10位置上
题解
使用贪心算法对问题求解时,总是做出当前情况下最优的的选择。暂时不从整体最优上加以考虑。
题目用到的是贪心算法,但是比较简单,在给定的数组parterre[]
中寻找所有能放下花的位置;
详见代码注释
代码:
#include <iostream>
#include <algorithm>
using namespace std;
bool canPlace(int *F,int len,int n){ // 创建bool类型的函数
int count = 0; // 计数器 计算当前种了多少花
if(n == 0){ // 如果到货0,那么返回true
return true;
}
int i = 0; // while的判断初始值
while(i < len){
if(F[i] == 1){ // 如果当前位置有花,那么下一个可以种花的位置是i+2
i+=2;
}else if(i > 0 && F[i-1] == 1){ // 如果左边有花,那么下一个可以种花的位置是i+1
i+=1;
}else if(i < len -1 && F[i+1] == 1){ // 如果右边有花,那么下一个可以种花的位置是i+3
i+=3;
}else{ // 如果以上条件都不满足,那么就可以在当前位置种花
count ++; // 计数器+1
i+=2; // 当前位置种花后,下一个可以种花的位置在i+2
if(count == n){ // 如果种的花和到货的n相同了,那么返回true
return true;
}
}
}
return false;
}
int main(void){
int n;
cin >> n;
int f[] = {0,1,0,1,0,0,0,1,0,0,1,0,0,0,1};
int len = sizeof(f)/sizeof(*f); // 解释①
if(canPlace(f,len,n)){
cout << "ok" << endl;
}else {
cout << "no" << endl;
}
return 0;
}
注意点 解释①
在函数调用数组的时候,大部分情况需要用到指针,例如void function(int *array)
,如果函数中需要用到数组长度的变量,需要在函数声明中加入而且需要用户在调用函数时加入该参数,例如void function(int *array,int length)
,如如果在函数中计算数组长度,那么sizeof计算的就会是指针所占用的空间,因为指针里存储的是地址,所以不管是什么类型的指针,在64位系统下所占内存都是4字节,换做int类型也就是1。所以会导致整个函数功能出现异常。
错误写法:
void function(int *array){
int length = sizeof(array) / sizeof(*array); // 这样计算会导致length中存储为 1
//函数功能
}
正确写法:
void function(int *array,int length){
//函数功能
}
int main(void){
int array[] = {1,2,3};
int length = sizeof(array) / sizeof(*array);
function(array,length);
// 其他代码
return 0;
}
尾言
感谢您的阅读!
如果文章有错误请留言指出,谢谢!