LeetCodeコンテスト166

LeetCodeコンテスト166

そこLeetCodeゲームはこれが初めて。

長い時間のために非常に興奮し、この行をプレイしていません。

問題解決に直接書きます

最初の質問

精神薄弱であります

class Solution {
public:
    int subtractProductAndSum(int n) {
        
        int num1=0;
        int num2=1;
        
        while(n)
        {
            int x = n%10;
            num1+=x;
            num2*=x;
            n/=10;
        }
        
   
        
        return num2-num1;
        
        
        
    }
};

2番目の質問は
、また、シーケンスのI最初の行は非常に簡単です。

しかし、C ++を使用した場合、高速行で、ピットである、私が習慣となっているカスタム比較関数を書くことであるRE、多くの時間を無駄にしている理由は、演算子のオーバーロードは、書き込み、私は知りませんしませんでした

 struct Node
    {
        int value;
        int index;
        Node(){}
        Node(int value,int index)
        {
            this->value = value;
            this->index = index;
        }
      bool operator <(const Node &x)const
    {
        return value<x.value; 
    }
    };


class Solution {
public:
    int vis[1005];
    Node a[1005];
    vector<vector<int>> groupThePeople(vector<int>& groupSizes) {
        int len = groupSizes.size();
        
        for(int i=0;i<len;i++)
        {
            a[i] = Node(groupSizes[i],i);
        }
        sort(a,a+len);
        vector<vector<int>> ans;
        
        vector<int> res;
        res.push_back(a[0].index);
        int num=0;
        for(int i=1;i<len;i++)
        {
            
            if(a[i].value==a[i-1].value)
            {
                if(res.size()==a[i].value)
                {
                    ans.push_back(res);
                    res.clear();
                    res.push_back(a[i].index);
                    continue;
                }
                res.push_back(a[i].index);
            }
            else
            {
                ans.push_back(res);
                res.clear();
                res.push_back(a[i].index);
            }
        }
        
        if(res.size()!=0)
        {
            ans.push_back(res);
        }
        
        return ans;
        
    }
    
   
};

3番目の質問

ハーフ、単発ではなく、どのように時間の無駄

class Solution {
public:
    int smallestDivisor(vector<int>& nums, int threshold) {
        
        int num=0;
        for(int i=0;i<nums.size();i++)
        {
            num=max(num,nums[i]);
        }
        int start = 1;
        int end = num;
        
        while(start<=end)
        {
            int mid = (start+end)/2;
            
            int sum=0;
            for(int i=0;i<nums.size();i++)
            {
                int x;
                if(nums[i]%mid==0)
                     x = nums[i]/mid;
                else
                    x = nums[i]/mid +1;
                
                sum+=x;
            }
            
            if(sum > threshold)
            {
                start = mid + 1;
                continue;
            }
            
            if(sum <= threshold)
            {
                end = mid - 1;
                continue;
            }
        }
        
        return start;
        
    }
};

第四に質問

非常にブラフを見ると、私はもつれに始まったDPではなく、データを見て、3ああの唯一の最大は、暴力を検索し、状態ビットコンピューティング保存マトリックスと、その後、前に剪定に注意を払います。2番目の質問にはある程度の時間が遅れるので、しかし、ちょっと、ちょうど第四の問題上、ゲームの終わりにつながります。

class Solution {
public:
    int vis[10005];
    int ans[10005];
    int map[10][10];
    int n,m;
    int result;
    int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
    int minFlips(vector<vector<int>>& mat) {

        int len = mat.size();
        n=len;
        m=mat[0].size();
        for(int i=0;i<mat.size();i++)
        {

            for(int j=mat[i].size()-1;j>=0;j--)
            {
                map[i][j] = mat[i][j];
            }

        }

        result = 9999999;

        int x = compute();
        if(x==0)
            return 0;
        vis[x]=1;
        ans[x]=0;

        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {
                fun(i,j,1);

                map[i][j] ^= 1;

                for(int k=0;k<4;k++)
                {
                    int xx = i+dir[k][0];
                    int yy = j+dir[k][1];

                    if(xx>=0&&xx<n&&yy>=0&&yy<m)
                        map[xx][yy] ^=1;
                }
            }
        }
        if(result == 9999999 )
            result =-1;

        return result;


    }

    void fun(int x,int y,int res)
    {
        map[x][y] ^= 1;

        for(int i=0;i<4;i++)
        {
            int xx = x+dir[i][0];
            int yy = y+dir[i][1];

            if(xx>=0&&xx<n&&yy>=0&&yy<m)
                map[xx][yy] ^=1;
        }

        int v = compute();
        if(vis[v]==1)
        {
            if(res>=ans[v])
            {
                return;
            }
            else
            {
                ans[v]=res;
            }
        }
        if(v==0)
        {
            result=min(result,res);
            return;
        }

        vis[v]=1;
        ans[v]=res;

        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {

                fun(i,j,res+1);


                map[i][j] ^= 1;

                for(int k=0;k<4;k++)
                {
                    int xx = i+dir[k][0];
                    int yy = j+dir[k][1];

                    if(xx>=0&&xx<n&&yy>=0&&yy<m)
                        map[xx][yy] ^=1;
                }
            }
        }
    }

    int compute()
    {
        int x=0;
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {
                x <<= 1;
                x |= map[i][j];
            }
        }

        return x;
    }
};


おすすめ

転載: www.cnblogs.com/dacc123/p/12005351.html