leetcode 第 29 场双周赛

leetcode 第 29 场双周赛_第1张图片

直接暴力做法,排序之后去掉最大最小就行
线性做法应该就直接记录最大最小,但是没必要


class Solution {
public:
    double average(vector& a) {
        sort(a.begin(), a.end());
        double ans = 0;
        for(auto e:a)
            ans += e;
        ans -= a[0];
        ans -= a.back();
        return ans/(a.size()-2);
    }
};

leetcode 第 29 场双周赛_第2张图片

手速场就是舒服,直接O(sqrt(N))求因子,然后排序一下输出

class Solution {
public:
    int kthFactor(int n, int k) {
        vector ans;
        for(int i=1; i*i<=n; i++){
            if(n%i==0){
               ans.push_back(i);
            if(i*i!=n)
                ans.push_back(n/i);
                    
            }
        }
        sort(ans.begin(), ans.end());
        return ans.size()

leetcode 第 29 场双周赛_第3张图片

记录前缀和后缀的1的个数,貌似写复杂了
双指针应该可以更快而且节省空间

class Solution {
public:
    int longestSubarray(vector& a) {
        vector b(a.size()+5, 0), c(a.size()+5, 0);
        for(int i=0; i=0; i--){
            if(a[i]==1)
                c[i]=c[i+1]+1;
            else{
               c[i]=0;
            }
        }
        int ans=0;
        for(int i=0; i

leetcode 第 29 场双周赛_第4张图片

这道题,虽然过了但是很羞愧,用的是个假算法


假算法
1. 求每个节点的出度的大小
2. 对图利用优先队列进行一波拓扑排序
但是这个贪心策略是有问题的,在面对出度相同的时候
而且节点可选个数多于k时,会出现错误


struct Node{
    int no;
    int child;
    Node(){
        no=0;
        child=0;
    }
    friend bool operator<(const Node& a,const  Node& b){
        return a.child>& dep, int k) {
        priority_queue pq;
        Node no[16];
        vector in(n+1, 0);
        for(int i=0; i<16; i++)
            no[i].no=i;
        vector> G(n+1, vector(0));
        for(auto e:dep){
            in[e[1]]++;
            no[e[0]].child += 1;
            G[e[0]].push_back(e[1]);
        }
        int ans = 0;
        for(int i=1; i<=n; i++){
            if(in[i]==0)
                pq.push(no[i]);
        }
        vector temp;
        cout<

正确的做法
状压dp, 课程用一个整数的二进制位表示
则dp[i|chose] = min(dp[i|chose], dp[i]+1)
其中i表示当前已经修过的课
chose表示下一个学期可以修的课


class Solution {
    public final int INT_MAX = 101;
    public int[] dp =null;  //dp数组
    public int minNumberOfSemesters(int n, int[][] dependencies, int k) {
        dp = new int[1<>e[0]&1)==0)
                    unable |= 1<>j&1)==0&&(i>>j&1)==0)
                    can |= 1<>j&1)==0 && (can>>j&1)==1)
                dfs(n, k-1, i, can-(1<

你可能感兴趣的:(leetcode 第 29 场双周赛)