代码随想录训练营Day35

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:这里可以添加本文要记录的大概内容:

今天是跟着代码随想录刷题的第三十五天,主要是学习了加油站,分发糖果,柠檬水找零和根据身高重建队列这四道题。


提示:以下是本篇文章正文内容,下面案例可供参考

一、加油站

暴力解法:

class Solution {
public:
    int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
    int i;
    vector<int> a;
    int result=0;
    int start;
    int finish=1;
    int b;
    for(i=0;i<gas.size();i++)
    {
        a.push_back(gas[i]-cost[i]);
    }
    for(i=0;i<a.size();i++)
    {
        result=result+a[i];
    }
    if(result<0) return -1;
    for(start=0;start<a.size();start++)
    {
        result=0;
        for(i=start;i<a.size();i++)
        {
            result=result+a[i];
            if(result<0) 
            {
                finish=0;
                break;
            }
        }
        for(i=0;i<start;i++)
        {
            result=result+a[i];
            if(result<0) 
            {
                finish=0;
                break;
            }

        }
        if(finish==1) 
        {
            break;
        }
        finish=1;
        
    }
    return start;
    }
};

贪心算法

class Solution {
public:
    int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
        int curSum = 0;
        int totalSum = 0;
        int start = 0;
        for (int i = 0; i < gas.size(); i++) {
            curSum += gas[i] - cost[i];
            totalSum += gas[i] - cost[i];
            if (curSum < 0) {   // 当前累加rest[i]和 curSum一旦小于0
                start = i + 1;  // 起始位置更新为i+1
                curSum = 0;     // curSum从0开始
            }
        }
        if (totalSum < 0) return -1; // 说明怎么走都不可能跑一圈了
        return start;
    }
};

贪心算法就是我就一直累加,如果小于0,就说明前面这些都不可能是起点,因为如果是起点,那么起点到这大于0,整个小于0,前面第一段也小于0,说明有更早的起点,然后因为可以保持一直是最早的正数,所以这里就是最合适的起点的位置,可以累积正数。

二、分发糖果

思路:先从左到右保证如果右边大于左边,右边加1,不然就保持1,如果左边大于右边,左边加1和原本的比大小,取大的,就能保证两边了。
代码:

class Solution {
public:
    int candy(vector<int>& ratings) {
    int a=ratings.size();
    vector<int> result(ratings.size(), 1);
    int result1=0;
    int i;
    for(i=0;i<result.size()-1;i++)
    {
        if(ratings[i+1]>ratings[i])
        {
            result[i+1]=result[i]+1;
        }
    }
    for(i=result.size()-1;i>0;i--)
    {
        if(ratings[i-1]>ratings[i])
        {
            result[i-1]=max(result[i-1],result[i]+1);
        }
    }
    for(i=0;i<result.size();i++)
    {
        result1=result1+result[i];
    }
    return result1;

    }
};

三、柠檬水找零

思路:这道题就是思考柠檬水所有可能得情况来一种情况一种情况分析就可以了
代码:

class Solution {
public:
    bool lemonadeChange(vector<int>& bills) {
    int five=0,ten=0,i=0;
    for(i=0;i<bills.size();i++)
    {
        if(bills[i]==5) five++;
        if(bills[i]==10)
        {
            if(five==0) return false;
            else ten++,five--;
        }
        if(bills[i]==20)
        {
            if(five!=0&&ten!=0)
            {five--;
            ten--;}
            else if(ten==0&&five>2)
            {
                five=five-3;
            }
            else return false;
        }   
            
    }
    return true;
    }
};

四、根据身高重建队列

思路:
这道题就是按照身高由高到低先排个序,然后如果身高一样的,就第二位小的排序,首先得建立这个排序的思路,按照这个顺序排序以后,然后这种情况就能保证前面的和自己一样大或者比自己更大,再按照第二位看,是不是这个排序,比如第二位是3,就说明前面有三个比我要大,所以应该排在第三的位置。
所以看第二位是几,就排在那个位置就行。
版本一:

class Solution {
public:
    static bool cmp(const vector<int>& a, const vector<int>& b) {
        if (a[0] == b[0]) return a[1] < b[1];
        return a[0] > b[0];
    }
    vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
        sort (people.begin(), people.end(), cmp);
        vector<vector<int>> que;
        for (int i = 0; i < people.size(); i++) {
            int position = people[i][1];
            que.insert(que.begin() + position, people[i]);
        }
        return que;
    }
};

版本二:
代码:

class Solution {
public:
    // 身高从大到小排(身高相同k小的站前面)
    static bool cmp(const vector<int>& a, const vector<int>& b) {
        if (a[0] == b[0]) return a[1] < b[1];
        return a[0] > b[0];
    }
    vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
        sort (people.begin(), people.end(), cmp);
        list<vector<int>> que; // list底层是链表实现,插入效率比vector高的多
        for (int i = 0; i < people.size(); i++) {
            int position = people[i][1]; // 插入到下标为position的位置
            std::list<vector<int>>::iterator it = que.begin();
            while (position--) { // 寻找在插入位置
                it++;
            }
            que.insert(it, people[i]);
        }
        return vector<vector<int>>(que.begin(), que.end());
    }
};

1.引入库

代码如下(示例):

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
import  ssl
ssl._create_default_https_context = ssl._create_unverified_context

2.读入数据

代码如下(示例):

data = pd.read_csv(
    'https://labfile.oss.aliyuncs.com/courses/1283/adult.data.csv')
print(data.head())

该处使用的url网络请求的数据。


总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值