leetcode 153周赛

链接:https://leetcode-cn.com/contest/weekly-contest-153/

环形公交路线上有 n 个站,按次序从 0 到 n - 1 进行编号。我们已知每一对相邻公交站之间的距离,distance[i] 表示编号为 i 的车站和编号为 (i + 1) % n 的车站之间的距离。
环线上的公交车都可以按顺时针和逆时针的方向行驶。
返回乘客从出发点 start 到目的地 destination 之间的最短距离。

思路:看代码

class Solution {
public:
    int distanceBetweenBusStops(vector<int>& distance, int start, int destination) {
        int n=distance.size();
        int len=0;
        for(int i=0;i<n;++i)len+=distance[i];
        int dist=0;
        for(int i=start;i<destination;++i)dist+=distance[i];
        for(int i=destination;i<start;++i)dist+=distance[i];
        return min(dist,len-dist);
    }
};

给你一个日期,请你设计一个算法来判断它是对应一周中的哪一天。
输入为三个整数:day、month 和 year,分别表示日、月、年。
您返回的结果必须是这几个值中的一个 {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}。

思路:看代码(1971年1月1日,星期五

class Solution {
public:
    string dayOfTheWeek(int day, int month, int year) {
        int mon[]={31,28,31,30,31,30,31,31,30,31,30,31};
        string d[]={"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
        int len=4;
        for(int i=1971;i<year;++i){
            len=(len+365)%7;
            if(is_year(i))
                len=(len+1)%7;
        }
        for(int i=1;i<month;++i){
            if(is_year(year)&&i==2)len=(len+1)%7;
            len=(len+mon[i-1])%7;
        }
        len=(len+day)%7;
        return d[len];
    }
    bool is_year(int year){
        if(((year%4==0)&&(year%100!=0))||(year%400==0))
            return true;
        return false;
    }
};

给你一个整数数组,返回它的某个 非空 子数组(连续元素)在执行一次可选的删除操作后,所能得到的最大元素总和。
换句话说,你可以从原数组中选出一个子数组,并可以决定要不要从中删除一个元素(只能删一次哦),(删除后)子数组中至少应当有一个元素,然后该子数组(剩下)的元素总和是所有子数组之中最大的。
注意,删除一个元素后,子数组 不能为空。

思路:
1.这里left[i]表示的是以自身为右端点的一个连续区间段的最大值,right[i]相同
2.在求left[i]时可以顺带求不删除一个区间段的一个值的答案来更新答案。
3.最后求删除arr[i]时的情况

class Solution {
public:
    int maximumSum(vector<int>& arr) {
        if(arr.size()==1)return arr[0];//特殊情况
        int n=arr.size();
        vector<int> left(n+1);
        vector<int> right(n+1);
        left[0]=arr[0];
        int ans=arr[0];
        for(int i=1;i<n;++i){
            left[i]=max(left[i-1]+arr[i],arr[i]);//不删除
            ans=max(ans,left[i]);
        }
        right[n-1]=arr[n-1];
        for(int i=n-2;i>=0;i--){
            right[i]=max(right[i+1]+arr[i],arr[i]);
        }
        
        for(int i=0;i<n;++i){//删除arr[i]
            int l=0,r=0;
            if(i-1>=0){
                l=left[i-1];
                
            }
            if(i+1<n){
                r=right[i+1];
    
            }
            ans=max(ans,l+r);
            
        }
        return ans;
    }
};

猜你喜欢

转载自www.cnblogs.com/clear-love/p/11485706.html