简单贪心算法 入门必看 [C++]

7 篇文章 0 订阅

贪心算法入门

例题

【字节面试】 题目描述:
现有一个长花坛,有一部分已经种了花,还有一部分空出来,现在有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;
}

尾言

感谢您的阅读!
如果文章有错误请留言指出,谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

linlin9.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值