Weekly Contest 2020

weekly contest 195

2020.6.28

周赛刚开始,题还没看,leetcode竟然崩了!看来周赛越来越火了。

做了前两题。

1496. Path Crossing

给一个由上下左右构成的行动路径,判断按照此路径走会不会重复走一个点。

使用set保存走过的点即可

class Solution
{
public:
    bool isPathCrossing(string path)
    {
        int x = 0, y = 0;
        set<pair<int, int>> pos;

        pos.insert({0, 0});

        bool cross = false;
        for (int i = 0; i < path.size(); i++)
        {
            if (path[i] == 'N')
                y++;
            else if (path[i] == 'E')
                x--;
            else if (path[i] == 'S')
                y--;
            else
                x++;
                
            if (pos.find({x, y}) != pos.end())
                return true;
            pos.insert({x, y});
        }

        return cross;
    }
};

1497. Check If Array Pairs Are Divisible by k

给一串数字(偶数个),将其分成两两一组,判断是否能满足每一组的和都是k的倍数。

首先,对每个数字进行%k操作,如果是负数,再+k,这样,所有的数都被等价转换为[0,k-1]。对其进行技术,需要保证count(i)和count(k-i)个数相等,因为他们必须两两配对。count(0)的个数任意。当k为偶数的时候,需要考虑count(k/2)也是偶数,这样才能两两配对

class Solution
{
public:
    bool canArrange(vector<int> &arr, int k)
    {
        vector<int> count(k, 0);

        for (int i = 0; i < arr.size(); i++)
        {
            arr[i] %= k;
            if (arr[i] < 0)
                arr[i] += k;
            count[arr[i]]++;
        }

        for (int i = 1; i <= k / 2; i++)
        {
            if (count[i] != count[k - i])
                return false;
        }
        if (k % 2 == 0 && count[k / 2] % 2 != 0)
            return false;

        return true;
    }
};

1498. Number of Subsequences That Satisfy the Given Sum Condition

对一个数组序列,求有多少个子序列,其最大值最小值之和,不超过target值。

这个题主要是要想到,对数组进行排序。因为是子序列,而且用的最大最小值,所以结果与原数组的顺序是没有关系的,排完序求min和max就方便许多。

第二,要利用有序数组的two sum思想,使用left、right两个指针,当两数相加大于target时,right--,否则,能构成满足条件的子序列,此时,只要保证最小值是left,其他所有的子序列都满足,共有pow(2,right-left)个。计算完之后left++,更新最小值

第三,利用pows[i] = pows[i - 1] * 2 % big快速求出pow的值

class Solution
{
public:
    int numSubseq(vector<int> &nums, int target)
    {

        sort(nums.begin(), nums.end());
        static constexpr int big = 1000000007;

        vector<int> pows(nums.size(), 1);
        for (int i = 1; i < nums.size(); i++)
            pows[i] = pows[i - 1] * 2 % big;

        int count = 0;

        int left = 0, right = nums.size() - 1;

        while (left <= right)
        {
            if (nums[left] + nums[right] > target)
            {
                right--;
            }
            else
            {
                count += pows[right - left];
                count %= big;
                left++;
            }
        }

        return count;
    }
};

1499. Max Value of Equation

依然没看题

weekly contest 196

2020.07.05

做了前两题。难顶啊

1502. Can Make Arithmetic Progression From Sequence

判断数组重排序后能否组成等差数列。排个序判断一下。

class Solution
{
public:
    bool canMakeArithmeticProgression(vector<int> &arr)
    {
        sort(arr.begin(), arr.end());
        int d = arr[1] - arr[0];
        for (int i = 1; i < arr.size() - 1; i++)
        {
            if (arr[i + 1] - arr[i] != d)
                return false;
        }
        return true;
    }
};

1503. Last Moment Before All Ants Fall Out of a Plank

主要是别被题目迷惑了,其实两只蚂蚁碰撞后,可以理解为互换了身份,其实并没有什么影响。所以只需要找到离边最远的那只蚂蚁即可。

class Solution
{
public:
    int getLastMoment(int n, vector<int> &left, vector<int> &right)
    {
        sort(left.begin(), left.end());
        sort(right.begin(), right.end());

        int l = left.size() == 0 ? 0 : left.back();
        int r = right.size() == 0 ? 0 : n - right[0];
        return max(l, r);
    }
};

1504. Count Submatrices With All Ones

求矩阵的所有全1子矩阵个数

以[i][j]作为矩阵的右下角,dp[i][j]表示从[i][j]起往上数,有多少个1.用动态规划很容易求得。

得到这个数后,再考虑将1*dp[i][j]的矩阵往左,求出min(minv, dp[i][k]); 即能得到更"宽"的全1矩阵个数

class Solution
{
public:
    int numSubmat(vector<vector<int>> &mat)
    {
        int m = mat.size();
        int n = mat[0].size();
        vector<vector<int>> dp(m, vector<int>(n, 0));
        int ret = 0;
        for (int i = 0; i < m; i++)
        {
            for (int j = 0; j < n; j++)
            {
                if (mat[i][j] == 0)
                    continue;
                dp[i][j] = (i > 0 ? dp[i - 1][j] : 0) + 1;
                int minv = dp[i][j];
                for (int k = j; k >= 0; k--)
                {
                    minv = min(minv, dp[i][k]);
                    ret += minv;
                }
            }
        }
        return ret;
    }
};

1505. Minimum Possible Integer After at Most K Adjacent Swaps On Digits

给一个由数字组成的string,和整数K。在K次交换相邻两个数字后,能得到的最小数是多少

weekly contest 197

2020.7.12

做了前三题,最后一题参考了python版本的代码,可惜没有来得及做出来。

1512. Number of Good Pairs

class Solution
{
public:
    int numIdenticalPairs(vector<int> &nums)
    {
        unordered_map<int, int> count;
        for (int i = 0; i < nums.size(); i++)
            count[nums[i]]++;
        int ret = 0;
        for (auto it = count.begin(); it != count.end(); it++)
        {
            ret += it->second * (it->second - 1) / 2;
        }
        return ret;
    }
};

1513. Number of Substrings With Only 1s

求01字符串有多少个全1子串。

先利用dp计算出所有长为n的全1串有多少字串,再找到字符串中的所有最长全1串

从discussion中抄了个nb的代码

int numSub(string s)
{
    int res = 0, count = 0, mod = 1e9 + 7;
    for (char c : s)
    {
        count = c == '1' ? count + 1 : 0;
        res = (res + count) % mod;
    }
    return res;
}

1514. Path with Maximum Probability

一开始想着用类似A-star算法进行求解,但发现排序的操作太耗时了,改用priority_queue能过。看了评论发现可以用vector<double>来记录概率,并记录该点是否需要访问,非常巧妙


class Solution
{
public:
    double maxProbability(int n, vector<vector<int>> &edges, vector<double> &succProb, int start, int end)
    {
        //将参数数据进行转换。
        vector<vector<pair<int, double>>> myedge(n);
        for (int i = 0; i < edges.size(); i++)
        {
            myedge[edges[i][0]].push_back({edges[i][1], succProb[i]});
            myedge[edges[i][1]].push_back({edges[i][0], succProb[i]});
        }

        //利用一个vector存储所有点当前的最大概率。只有当求出来的概率比当前概率大时,才去访问对应的路径
        vector<double> probs(n, 0);
        probs[start] = 1.0;
        vector<int> nodes;
        nodes.push_back(start);

        while (!nodes.empty())
        {
            vector<int> new_nodes;
            for (auto e : nodes)    //遍历当前的所有点,求出到达的下一个点的概率
            {
                for (int i = 0; i < myedge[e].size(); i++)
                {
                    //仅当新概率比原概率高的时候,更新概率,并继续遍历。
                    if (probs[e] * myedge[e][i].second > probs[myedge[e][i].first])
                    {
                        probs[myedge[e][i].first] = probs[e] * myedge[e][i].second;
                        new_nodes.push_back(myedge[e][i].first);
                    }
                }
            }

            swap(nodes, new_nodes);
        }
        return probs[end];
    }
};

1515. Best Position for a Service Centre

给出平面内很多个二维点(x,y),找到一个点,使其到所有这些点的距离之和最小。基准点选择所有点的算术中心点。

竟然考了道数学题。利用机器学习中的梯度下降法求解。

class Solution
{
public:
    double dist(vector<double> &p1, vector<int> &p2)
    {
        return sqrt((p1[0] - p2[0]) * (p1[0] - p2[0]) + (p1[1] - p2[1]) * (p1[1] - p2[1]));
    }

    double cost(vector<double> &point, vector<vector<int>> &positions)
    {
        double sum = 0;
        for (int i = 0; i < positions.size(); i++)
        {
            sum += dist(point, positions[i]);
        }
        return sum;
    }

    pair<double, double> gradient(vector<double> &point, vector<vector<int>> &positions)
    {
        double dx = 0, dy = 0;
        for (int i = 0; i < positions.size(); i++)
        {
            if (dist(point, positions[i]) != 0)
            {
                dx += (point[0] - positions[i][0]) / dist(point, positions[i]);
                dy += (point[1] - positions[i][1]) / dist(point, positions[i]);
            }
        }

        double s = sqrt(dx * dx + dy * dy);
        dx /= s;
        dy /= s;
        return {dx, dy};
    }

    double getMinDistSum(vector<vector<int>> &positions)
    {
        double rate = 0.01;
        int step = 100000;

        vector<double> point(2, 0);

        for (int i = 0; i < positions.size(); i++)
        {
            point[0] += positions[i][0];
            point[1] += positions[i][1];
        }

        point[0] /= positions.size();
        point[1] /= positions.size();

        point.push_back(positions[0][0] + 1e-8);
        point.push_back(positions[0][1] + 1e-8);
        double epsilon = 1e-7;
        for (int i = 0; i < step; i++)
        {
            double cost_ori = cost(point, positions);
            auto g = gradient(point, positions);

            vector<double> newpoint;
            newpoint.push_back(point[0] - rate * g.first);
            newpoint.push_back(point[1] - rate * g.second);
            double cost_new = cost(newpoint, positions);
            if (cost_ori - cost_new > epsilon)
            {
                point = newpoint;
            }
            else if (cost_new - cost_ori > epsilon)
                rate *= 0.3;
            else
                break;
        }
        return cost(point, positions);
    }
};

weekly contest 198

2020.07.19

这次的周赛也太难了...一小时就做出一道题,再加半小时应该还能再做出一题,我太菜了。

1518. Water Bottles

经典空瓶换饮料。

class Solution
{
public:
    int numWaterBottles(int numBottles, int numExchange)
    {

        int ret = 0;
        int empty = 0;

        while (numBottles > 0 || empty >= numExchange)
        {
            ret += numBottles;
            empty += numBottles;
            numBottles = empty / numExchange;
            empty %= numExchange;
        }

        return ret;
    }
};

1519. Number of Nodes in the Sub-Tree With the Same Label

给一个树,求以每个结点作为根节点的子树,label出现次数。dfs

这道题卡常..可以说在leetcode非常少见。优化了以后才过的。再不行就把vector换成指针。

class Solution
{
public:
    vector<int> countSubTrees(int n, vector<vector<int>> &edges, string labels)
    {
        vector<vector<int>> map(n);
        for (int i = 0; i < edges.size(); i++)
        {
            map[edges[i][0]].push_back(edges[i][1]);
            map[edges[i][1]].push_back(edges[i][0]);
        }
        vector<int> ret(n, 0);
        helper(0, map, labels, ret);
        return ret;
    }

    vector<int> helper(int node, vector<vector<int>> &edge, string &labels, vector<int> &ret)
    {
        vector<int> r(26, 0);
        ret[node]++;
        r[labels[node] - 'a']++;
        auto nextnode = edge[node];
        for (int i = 0; i < nextnode.size(); i++)
        {
            if (ret[nextnode[i]] != 0)
                continue;
            auto count = helper(nextnode[i], edge, labels, ret);

            for (int i = 0; i < 26; i++)
            {
                r[i] += count[i];
            }
        }
        ret[node] = r[labels[node] - 'a'];
        return r;
    }
};

1520. Maximum Number of Non-Overlapping Substrings

后面两题都没看

1521. Find a Value of a Mysterious Function Closest to Target

weekly contest 199

2020.07.26

今天出去玩啦,并没有参加,题目是晚上补的。前两天很简单,第三题有点难,看评论说第四题特别难,我选择不看hhh

1528. Shuffle String

class Solution
{
public:
    string restoreString(string s, vector<int> &indices)
    {
        string rtn = s;

        for (int i = 0; i < indices.size(); i++)
        {
            rtn[indices[i]] = s[i];
        }
        return rtn;
    }
};

1529. Bulb Switcher IV

灯泡亮灭问题。其实逻辑很简单,判断相邻的两个灯是否初始状态相同即可。用pre保存上一个灯的状态,一开始为默认的状态‘0’

class Solution
{
public:
    int minFlips(string target)
    {
        int rtn = 0;
        char pre = '0';
        for (int i = 0; i < target.size(); i++)
        {
            if (target[i] != pre)
            {
                rtn++;
                pre = target[i];
            }
        }
        return rtn;
    }
};

1530. Number of Good Leaf Nodes Pairs

判断树的叶节点之间的距离,有多少对小于distance。

dfs吧,不太会。

1531. String Compression II

weekly contest 200

2020.08.02

这次的周赛题目难度相对简单一点。1小时做了3题

1534. Count Good Triplets

brute force

class Solution
{
public:
    int countGoodTriplets(vector<int> &arr, int a, int b, int c)
    {
        int count = 0;
        for (int i = 0; i < arr.size() - 2; i++)
        {
            for (int j = i + 1; j < arr.size() - 1; j++)
            {
                if (fabs(arr[i] - arr[j]) > a)
                    continue;
                for (int k = j + 1; k < arr.size(); k++)
                {
                    if (fabs(arr[i] - arr[k]) > c || fabs(arr[j] - arr[k]) > b)
                        continue;
                    count++;
                }
            }
        }

        return count;
    }
};

1535. Find the Winner of an Array Game

主要是保存head(当前最大值)

class Solution
{
public:
    int getWinner(vector<int> &arr, int k)
    {

        int head = arr[0];
        int count = 0;
        for (int i = 1; i < arr.size(); i++)
        {
            if (arr[i] > head)
            {
                head = arr[i];
                count = 0;
            }
            if (++count == k)
                return head;
        }

        return head;
    }
};

1536. Minimum Swaps to Arrange a Binary Grid

这道题其实没那么复杂。先统计每行有多少个连续的0(从右往左)

根据贪心策略,第i行需要n-i-1个0,那么找到最近能满足的那一行,进行交换(注意交换是相邻的,所以有一个移动操作)。如果不满足,则返回-1

class Solution
{
public:
    int minSwaps(vector<vector<int>> &grid)
    {
        int n = grid.size();
        vector<int> rowZeroCount(n, 0);
        for (int i = 0; i < n; i++)
        {
            for (int j = n - 1; j >= 1; j--)
            {
                if (grid[i][j] == 0)
                    rowZeroCount[i]++;
                else
                    break;
            }
        }
        int rtn = 0;
        for (int k = n - 1; k >= 1; k--)
        {
            int s = n - k - 1;
            int i = s;
            for (; i < n; i++)
            {
                if (rowZeroCount[i] >= k)
                {
                    rtn += i - s;
                    for (int x = i; x > s; x--)
                    {
                        rowZeroCount[x] = rowZeroCount[x - 1];
                    }
                    break;
                }
            }
            if (i == n)
                return -1;
        }

        return rtn;
    }
};

1537. Get the Maximum Score

看了眼题,看解答也不是很复杂的样子,留个坑以后填吧

https://leetcode.com/problems/get-the-maximum-score/discuss/767987/JavaC%2B%2B-Two-Pointers-O(1)-Space

weekly contest 201

2020.08.09

今天出去玩了,没参赛。题目应该只会做两题。

1544. Make The String Great

brute-force。主要是要注意大写加小写和小写加大写都算vice-versa

class Solution
{
public:
    string makeGood(string s, int sz = 0)
    {
        while (sz != s.size())
        {
            sz = s.size();
            for (int i = 0; i + 1 < s.size(); ++i)
                if (s[i] != s[i + 1] && tolower(s[i]) == tolower(s[i + 1]))
                {
                    s = s.substr(0, i) + s.substr(i + 2);
                }
        }
        return s;
    }
};

1545. Find Kth Bit in Nth Binary String

用递归解。注意是reverse+invert

class Solution
{
public:
    char findKthBit(int n, int k)
    {
        if (n == 1)
            return '0';

        int len = (1 << n) - 1;

        if (k == len / 2 + 1)
        {
            return '1';
        }
        else if (k > len / 2 + 1)
        {
            return findKthBit(n - 1, len - k + 1) == '1' ? '0' : '1';
        }
        else
            return findKthBit(n - 1, k);
    }
};

1546. Maximum Number of Non-Overlapping Subarrays With Sum Equals Target

求最多能有多少个不重叠的子数组,和为target

dp?

1547. Minimum Cost to Cut a Stick

weekly contest 202

2020.08.16

做了前两题,很简单。后两题顶不住

1550. Three Consecutive Odds(https://leetcode.com/problems/three-consecutive-odds)

class Solution
{
public:
    bool threeConsecutiveOdds(vector<int> &arr)
    {
        if (arr.size() < 3)
            return false;
        for (int i = 0; i < arr.size() - 2; i++)
        {
            if ((arr[i] % 2 == 1) && (arr[i + 1] % 2 == 1) && (arr[i + 2] % 2 == 1))
                return true;
        }
        return false;
    }
};

1551. Minimum Operations to Make Array Equal(https://leetcode.com/problems/minimum-operations-to-make-array-equal/)

class Solution
{
public:
    int minOperations(int n)
    {
        return (n % 2 == 0) ? (n / 2) * (n / 2) : (n / 2) * (n / 2 + 1);
    }
};
```cpp

### 1552. Magnetic Force Between Two Balls(https://leetcode.com/problems/magnetic-force-between-two-balls/)

给定n个位置,和m个球,如何放置能够使得球与球之间的距离最小值最大?

二分法?

### 1553. Minimum Number of Days to Eat N Oranges(https://leetcode.com/problems/minimum-number-of-days-to-eat-n-oranges/)

n个橘子,每天有三种吃法:

* 吃1个
* n%3==0,吃掉2/3
* n%2==0,吃掉1/2

最少需要多少天能吃完?

用unordered_map作为dp

```cpp
class Solution
{
public:
    unordered_map<int, int> dp;
    int minDays(int n)
    {
        if (n <= 1)
            return n;
        if (dp.count(n) == 0)
            dp[n] = 1 + min(n % 2 + minDays(n / 2), n % 3 + minDays(n / 3));
        return dp[n];
    }
};

weekly contest 203

2020.08.23

昨天加班到12点。今天起来头晕晕的,做了前两题。都比较简单

1560. Most Visited Sector in a Circular Track

第一题的难点主要在于读懂题目。只要关心头尾两个数就行了。

哈哈哈哈这道题全是👎,我也情不自禁点了一个

class Solution
{
public:
    vector<int> mostVisited(int n, vector<int> &rounds)
    {
        int start = rounds[0];
        int end = rounds.back();
        vector<int> ret;
        if (end >= start)
        {
            for (int i = start; i <= end; i++)
                ret.push_back(i);
        }
        else if (end < start)
        {
            for (int i = 1; i <= end; i++)
                ret.push_back(i);
            for (int i = start; i <= n; i++)
                ret.push_back(i);
        }

        return ret;
    }
};

1561. Maximum Number of Coins You Can Get

抓硬币问题。很简单,排个序,去掉1/3个最小的,然后隔两个取一个就行了。记得leetcode有类似的题。说实话这道题注水很严重,不配medium难度。

class Solution
{
public:
    int maxCoins(vector<int> &piles)
    {
        sort(piles.begin(), piles.end());
        int n = piles.size();
        int k = n / 3;
        int rtn = 0;
        for (int i = k; i < n; i += 2)
            rtn += piles[i];
        return rtn;
    }
};

1562. Find Latest Group of Size M

难。

1563. Stone Game V

难。

weekly contest 204

2020.8.30

就做了一题。我也太菜了吧。

1566. Detect Pattern of Length M Repeated K or More Times

brute-force即可

class Solution
{
public:
    bool containsPattern(vector<int> &arr, int m, int k)
    {

        for (int i = 0; i < arr.size(); i++)
        {
            bool flag = true;
            for (int n = 0; n < m; n++)
            {
                int p = i;
                for (int j = 1; j < k; j++)
                {
                    p += m;
                    if ((p + n) >= arr.size() || arr[i + n] != arr[p + n])
                    {
                        flag = false;
                        break;
                    }
                }
            }
            if (flag)
                return true;
        }
        return false;
    }
};

1567. Maximum Length of Subarray With Positive Product

给一个int数组,求最长子数组,其乘积为正数。

1568. Minimum Number of Days to Disconnect Island

1569. Number of Ways to Reorder Array to Get Same BST

weekly contest 205

2020.09.06

做了前三题。比较简单

1576. Replace All ?'s to Avoid Consecutive Repeating Characters

一道让我缓缓打出?并连答案也不想放的题

1577. Number of Ways Where Square of Number Is Equal to Product of Two Numbers

每次看完大佬写的代码再看看我写的辣鸡代码,都会怀疑人生

class Solution
{
public:
    int cal(vector<int> &nums1, unordered_map<int, int> &counter2)
    {
        int ret = 0;
        unordered_map<int, int> dp;
        for (int i = 0; i < nums1.size(); i++)
        {
            if (dp.find(nums1[i]) != dp.end())
            {
                ret += dp[nums1[i]];
            }
            else
            {
                long long mul = (long long)nums1[i] * nums1[i];
                for (int m = 1; m <= nums1[i]; m++)
                {
                    if (mul % m == 0)
                    {
                        if (counter2.find(m) != counter2.end() && counter2.find(mul / m) != counter2.end())
                        {
                            if (m == mul / m)
                            {
                                ret += counter2[m] * (counter2[m] - 1) / 2;
                            }
                            else
                                ret += counter2[m] * counter2[mul / m];
                        }
                    }
                }
            }
        }

        return ret;
    }

    int numTriplets(vector<int> &nums1, vector<int> &nums2)
    {

        unordered_map<int, int> counter1, counter2;
        for (int i = 0; i < nums1.size(); i++)
            counter1[nums1[i]]++;
        for (int i = 0; i < nums2.size(); i++)
            counter2[nums2[i]]++;

        return cal(nums1, counter2) + cal(nums2, counter1);
    }
};

1578. Minimum Deletion Cost to Avoid Repeating Letters

太辣鸡了,没法看。什么时候能一遍写出优美的代码啊

class Solution
{
public:
    int del(int start, int end, vector<int> &cost)
    {
        int maxval = cost[start];
        int sum = 0;
        for (int i = start; i < end; i++)
        {
            maxval = max(cost[i], maxval);
            sum += cost[i];
        }
        return sum - maxval;
    }
    int minCost(string s, vector<int> &cost)
    {
        int ret = 0;
        for (int i = 0; i < s.length();)
        {
            int j = i + 1;
            for (; j < s.length();)
            {
                if (s[i] == s[j])
                    j++;
                else
                {
                    ret += del(i, j, cost);
                    break;
                }
            }
            if (j == s.length())
            {
                ret += del(i, j, cost);
            }

            i = j;
        }
        return ret;
    }
};

1579. Remove Max Number of Edges to Keep Graph Fully Traversable

weekly contest 206

2020.09.13

做了两题

1582. Special Positions in a Binary Matrix

brute-force

class Solution
{
public:
    int numSpecial(vector<vector<int>> &mat)
    {
        int m = mat.size();
        int n = mat[0].size();
        int ret = 0;
        for (int i = 0; i < m; i++)
        {
            for (int j = 0; j < n; j++)
            {
                if (mat[i][j] == 1)
                {
                    bool flag = true;
                    for (int k = 0; k < m; k++)
                    {
                        if (k != i && mat[k][j] == 1)
                        {
                            flag = false;
                            break;
                        }
                    }
                    for (int k = 0; k < n; k++)
                    {
                        if (k != j && mat[i][k] == 1)
                        {
                            flag = false;
                            break;
                        }
                    }

                    if (flag)
                        ret++;
                }
            }
        }
        return ret;
    }
};

1583. Count Unhappy Friends

傻逼题目。。

1584. Min Cost to Connect All Points

给一些二维点,求一个最小子树,使得连接的代价最小。两个点的代价是|x1-x2|+|y1-y2|

prime或者kruskal算法。但好像会TLE?

1585. Check If String Is Transformable With Substring Sort Operations

weekly contest 207

2020.09.20

做了前两题

1592. Rearrange Spaces Between Words

主要是要注意只有一个单词的情况

class Solution
{
public:
    string reorderSpaces(string text)
    {
        vector<string> words;

        std::istringstream is(text);
        do
        {
            std::string substr;
            is >> substr;
            if (substr != "")
                words.push_back(substr);
        } while (is);

        int spaceCount = 0;
        for (int i = 0; i < text.length(); i++)
            if (text[i] == ' ')
                spaceCount++;
        if (words.size() == 1)
        {
            string ret = words[0];
            for (int j = 0; j < spaceCount; j++)
                ret += ' ';
            return ret;
        }

        int x = spaceCount / (words.size() - 1);
        int y = spaceCount % (words.size() - 1);
        string ret = "";

        for (int i = 0; i < words.size() - 1; i++)
        {
            ret += words[i];
            for (int j = 0; j < x; j++)
                ret += ' ';
        }
        ret += words.back();
        for (int j = 0; j < y; j++)
            ret += ' ';
        return ret;
    }
};

1593. Split a String Into the Max Number of Unique Substrings

把一个字符串分成一定数量的子串,使得每个子串各不相同,问最多能分成多少个子串。dfs

class Solution
{
public:
    int maxsize;
    int helper(string &str, set<string> &strs)
    {
        if (str == "")
        {
            int n = strs.size();
            maxsize = max(n, maxsize);
            return 0;
        }
        for (int i = 1; i <= str.length(); i++)
        {
            string tempstr = str.substr(0, i);
            if (strs.count(tempstr))
                continue;
            auto it = strs.insert(tempstr);
            auto xx = str.substr(i);
            helper(xx, strs);
            strs.erase(tempstr);
        }
        return 0;
    }

    int maxUniqueSplit(string s)
    {
        maxsize = 0;
        set<string> myset;
        helper(s, myset);
        return maxsize;
    }
};

1594. Maximum Non Negative Product in a Matrix

一个矩形有正有负,求从左上到右下按一定的路径走能获得的最大乘积。(只能往下或者往右走) dp

1595. Minimum Cost to Connect Two Groups of Points

weekly contest 208

2020.09.30

因为国庆调休,并没有参加。今天放假了,补一下。

1598. Crawler Log Folder

class Solution
{
public:
    int minOperations(vector<string> &logs)
    {

        int ret = 0;
        for (const auto &str : logs)
        {
            if (str == "./")
                continue;
            else if (str == "../")
            {
                if (ret > 0)
                    ret--;
            }
            else
                ret++;
        }
        return ret;
    }
};

1599. Maximum Profit of Operating a Centennial Wheel

class Solution {
public:
    int minOperationsMaxProfit(vector<int>& customers, int boardingCost, int runningCost) {
        
        if(boardingCost*4 <=runningCost)
            return -1;
        
        int waiting = 0;
        int times = 0;
        int maxValue = 0;
        int value = 0;
        int ret = -1;
        int i = 0;
        while(i<customers.size()|| waiting!=0)
        {
            if(i<customers.size())
                waiting+=customers[i++];
            int board = waiting>4?4:waiting;
            waiting-=board;
            value += board*boardingCost-runningCost;
            if(value>maxValue)
            {
                maxValue= value;
                ret = times+1;
            }
            times++;
            
        }
        return ret;
    }
};

1600. Throne Inheritance

1601. Maximum Number of Achievable Transfer Requests

weekly contest 209

2020.10.04

以为今天周六,就错过了。。定了个闹钟,以防下次又忘了

1608. Special Array With X Elements Greater Than or Equal X

求x,使得nums中大于等于x的数的个数为x

先排序,然后用lower_bound,求出大于等于x的数的个数。

class Solution
{
public:
    int specialArray(vector<int> &nums)
    {

        sort(nums.begin(), nums.end());
        for (int i = 0; i <= nums.size(); i++)
        {
            auto it = lower_bound(nums.begin(), nums.end(), i);
            if (nums.end() - it == i)
                return i;
        }
        return -1;
    }
};

1609. Even Odd Tree

判断是否是奇偶二叉树:奇数层严格递减,偶数层严格递增。奇数层都是偶数,偶数层都是奇数。

dfs

class Solution
{
public:
    unordered_map<int, int> m;
    bool dfs(TreeNode *root, int level)
    {
        if (root == NULL)
            return true;
        int flag_level = level % 2;
        int flag_val = root->val % 2;
        if (!flag_level && !flag_val || flag_level && flag_val)
        {
            return false;
        }
        if (m.find(level) != m.end())
        {
            if (!flag_level && m[level] >= root->val || flag_level && m[level] <= root->val)
                return false;
        }
        m[level] = root->val;

        return dfs(root->left, level + 1) && dfs(root->right, level + 1);
    }
    bool isEvenOddTree(TreeNode *root)
    {
        return dfs(root, 0);
    }
};

1610. Maximum Number of Visible Points

1611. Minimum One Bit Operations to Make Integers Zero

weekly contest 210

2020.10.11

做了3题,都比较常规,第四题没时间看。第三题需要优化

1614. Maximum Nesting Depth of the Parentheses(https://leetcode.com/problems/maximum-nesting-depth-of-the-parentheses/)

题目哔哔了一大堆,结果就是求个括号最大深度。。

class Solution
{
public:
    int maxDepth(string s)
    {

        int depth = 0;
        int ret = 0;
        for (int i = 0; i < s.length(); i++)
        {
            if (s[i] == '(')
            {
                depth++;
                ret = max(ret, depth);
            }
            else if (s[i] == ')')
                depth--;
        }
        return ret;
    }
};

1615. Maximal Network Rank(https://leetcode.com/problems/maximal-network-rank/)

没注意题目给的n很小,所以只需要O(n^2)遍历就可以了。

class Solution
{
public:
    int maximalNetworkRank(int n, vector<vector<int>> &roads)
    {
        vector<int> cnt(n);
        size_t res = 0;
        set<pair<int, int>> adjacent;
        for (auto r : roads)
        {
            ++cnt[r[0]];
            ++cnt[r[1]];
            adjacent.insert({min(r[0], r[1]), max(r[0], r[1])});
        }
        for (auto i = 0; i < n; ++i)
            for (auto j = i + 1; j < n; ++j)
                res = max(res, cnt[i] + cnt[j] - adjacent.count({i, j}));
        return res;
    }
};

1616. Split Two Strings to Make Palindrome(https://leetcode.com/problems/split-two-strings-to-make-palindrome/)

判断a,b两个字符串能否分割后构成回文序列。求两个穿中间的部分是否是回文序列即可。

class Solution
{
public:
    bool isPa(string &s, int i, int j)
    {
        for (; i < j; ++i, --j)
            if (s[i] != s[j])
                return false;
        return true;
    }

    bool check(string &a, string &b)
    {
        for (int i = 0, j = a.size() - 1; i < j; ++i, --j)
            if (a[i] != b[j])
                return isPa(a, i, j) || isPa(b, i, j);
        return true;
    }

    bool checkPalindromeFormation(string a, string b)
    {
        return check(a, b) || check(b, a);
    }
};

1617. Count Subtrees With Max Distance Between Cities

Weekly Contest 211

2020.10.18

有点难啊,只会做第一题。这周好累,今天补觉

1624. Largest Substring Between Two Equal Characters

求字符串中相同两个字母最大间距

class Solution {
public:
    int maxLengthBetweenEqualCharacters(string s) {
        
        int ret = -1;
        vector<int> last(26,-1);
        for(int i =0;i<s.length();i++)
        {
            if(last[s[i]-'a'] == -1)
                last[s[i]-'a'] = i;
            else
            {
                ret = max(ret,i-last[s[i]-'a']-1);
            }
        }
        return ret;     
        
    }
};

1625. Lexicographically Smallest String After Applying Operations

dfs 暴力求解。

1626. Best Team With No Conflicts

组建一个球队,每个队员有能力值score,年龄age,选则出一个球队使sum(score)最大,且年龄大的球员score不低于年龄小的球员

dp

class Solution
{
public:
    int bestTeamScore(vector<int> &scores, vector<int> &ages)
    {
        vector<pair<int, int>> players;
        int n = scores.size();
        for (int i = 0; i < n; i++)
        {
            players.push_back({ages[i], scores[i]});
        }
        sort(players.begin(), players.end(), greater<>());

        int ans = 0;
        vector<int> dp(n + 1);
        dp[0] = 0;
        for (int i = 0; i < n; i++)
        {
            int score = players[i].second;
            dp[i] = score;
            for (int j = 0; j < i; j++)
            {
                if (players[j].second >= players[i].second)
                {   // age of j is certainly >= i, so only important part to check
                    //  before we add i and j in the same team is the score.
                    dp[i] = max(dp[i], dp[j] + score);
                }
            }
            ans = max(ans, dp[i]);
        }
        return ans;
    }
};

1627. Graph Connectivity With Threshold

Weekly Contest 212

2020.10.25 做了两题,第三题dfs超时

1629. Slowest Key

class Solution
{
public:
    char slowestKey(vector<int>& releaseTimes, string keysPressed)
    {
        vector<int> diff(releaseTimes.size());
        diff[0] = releaseTimes[0];
        int maxvalue = diff[0];
        for (int i = 1; i < releaseTimes.size(); i++)
        {
            diff[i] = releaseTimes[i] - releaseTimes[i - 1];
            maxvalue = max(maxvalue, diff[i]);
        }

        char retch = 'a';
        for (int i = 0; i < diff.size(); i++)
        {
            if (diff[i] == maxvalue && keysPressed[i] > retch)
                retch = keysPressed[i];
        }
        return retch;
    }
};

1630. Arithmetic Subarrays

判断是不是等差数列,brute force即可

class Solution
{
public:
    vector<bool> checkArithmeticSubarrays(vector<int>& nums, vector<int>& l, vector<int>& r)
    {

        vector<bool> ret(l.size(), true);

        for (int i = 0; i < l.size(); i++)
        {
            vector<int> tmp(nums.begin() + l[i], nums.begin() + r[i] + 1);
            sort(tmp.begin(), tmp.end());
            if (tmp.size() < 2)
            {
                ret[i] = true;
                continue;
            }
            int d = tmp[1] - tmp[0];
            for (int j = 0; j + 1 < tmp.size(); j++)
            {
                if (tmp[j] + d != tmp[j + 1])
                {
                    ret[i] = false;
                    break;
                }
            }
        }

        return ret;
    }
};

1631. Path With Minimum Effort

1632. Rank Transform of a Matrix

weekly contest 213

2020.11.1

今天睡懒觉了,起来做了两题

1640. Check Array Formation Through Concatenation

brute-force就行。hashmap更好

class Solution
{
public:
    bool canFormArray(vector<int>& arr, vector<vector<int>>& pieces)
    {

        for (auto& piece : pieces)
        {
            bool flag = false;
            for (int i = 0; i < arr.size(); i++)
            {
                bool same = true;
                for (int j = 0; j < piece.size(); j++)
                {
                    if (i + j > arr.size() || arr[i + j] != piece[j])
                    {
                        same = false;
                        break;
                    }
                }
                flag = same;
                if (flag)
                    break;
            }
            if (flag == false)
                return false;
        }

        return true;
    }
};

1641. Count Sorted Vowel Strings

动态规划

class Solution
{
public:
    int countVowelStrings(int n)
    {

        vector<vector<int>> dp(n + 1, vector<int>(5, 1));

        for (int i = 2; i <= n; i++)
        {
            int sum = 0;
            for (int j = 0; j < 5; j++)
            {
                sum += dp[i - 1][j];
                dp[i][j] = sum;
            }
        }
        int sum = 0;
        for (int j = 0; j < 5; j++)
        {
            sum += dp[n][j];
        }
        return sum;
    }
};

1642. Furthest Building You Can Reach

1643. Kth Smallest Instructions

Weekly Contest 214

2020.11.8 做了前两题

1646. Get Maximum in Generated Array

class Solution
{
public:
    int getMaximumGenerated(int n)
    {
        if (n <= 1)
            return n;

        vector<int> nums(n + 1);
        nums[0] = 0;
        nums[1] = 1;

        for (int i = 2; i <= n; i++)
        {
            if (i % 2 == 0)
            {
                nums[i] = nums[i / 2];
            }
            else
            {
                nums[i] = nums[i / 2] + nums[i / 2 + 1];
            }
        }

        int ret = 0;
        for (int i = 0; i <= n; i++)
        {
            ret = max(ret, nums[i]);
        }

        return ret;
    }
};

1647. Minimum Deletions to Make Character Frequencies Unique

代码好烂...

class Solution
{
public:
    int minDeletions(string s)
    {
        vector<int> f(26, 0);
        for (int i = 0; i < s.length(); i++)
        {
            f[s[i] - 'a']++;
        }

        sort(f.begin(), f.end());
        set<int> visited;
        int ret = 0;
        for (int i = 0; i < f.size(); i++)
            visited.insert(f[i]);
        for (int i = 0; i < f.size() - 1; i++)
        {
            if (f[i] == 0)
                continue;

            if (f[i] == f[i + 1])
            {
                for (int j = f[i] - 1; j >= 0; j--)
                {
                    if (j == 0)
                    {
                        ret += f[i];
                        continue;
                    }
                    if (!visited.count(j))
                    {
                        ret += f[i] - j;
                        visited.insert(j);
                        break;
                    }
                }
            }
        }
        return ret;
    }
};

1648. Sell Diminishing-Valued Colored Balls

1649. Create Sorted Array through Instructions

weekly contest 215

做了第一题..题目也太难懂了

1656. Design an Ordered Stream

class OrderedStream
{
public:
    int ptr;
    vector<string> strs;
    set<int> ids;
    OrderedStream(int n)
    {
        ptr = 1;
        strs.resize(n + 1);
    }

    vector<string> insert(int id, string value)
    {
        strs[id] = value;
        vector<string> ret;
        ids.insert(id);
        if (ids.count(ptr) == 1)
        {
            for (int i = ptr; i < strs.size(); i++)
            {
                if (ids.count(i) == 1)
                {
                    ret.push_back(strs[i]);
                }
                else
                    break;
            }
            ptr = ptr + ret.size();
        }
        return ret;
    }
};

1657. Determine if Two Strings Are Close

1658. Minimum Operations to Reduce X to Zero

1659. Maximize Grid Happiness

weekly contest 216

2020.11.21 今天实在太困了,没有参加。

1662. Check If Two String Arrays are Equivalent

可能是上周的第一题太难了,这周是送分题

class Solution
{
public:
    bool arrayStringsAreEqual(vector<string> &word1, vector<string> &word2)
    {
        string str1 = "";
        string str2 = "";
        for (auto &word : word1)
            str1 += word;
        for (auto &word : word2)
            str2 += word;
        return str1 == str2;
    }
};

1663. Smallest String With A Given Numeric Value

经典写垃圾代码

class Solution
{
public:
    string getSmallestString(int n, int k)
    {
        int remain = n;
        int value = k;
        string ret = "";

        while (value - remain + 1 >= 26)
        {
            ret += "z";
            value -= 26;
            remain -= 1;
        }

        if (value > 0)
        {
            int v = (value - remain + 1) % 26;
            value -= v;
            if (v > 0)
                ret += 'a' + v - 1;
        }
        remain--;
        for (int i = 0; i < remain; i++)
            ret += 'a';

        reverse(ret.begin(), ret.end());
        return ret;
    }
};

1664. Ways to Make a Fair Array

1665. Minimum Initial Energy to Finish Tasks

weekly contest 217

2020.11.28 起晚了,做了第一题吃饭去了。

1672. Richest Customer Wealth

class Solution
{
public:
    int maximumWealth(vector<vector<int>> &accounts)
    {

        int maxsum = 0;
        for (int i = 0; i < accounts.size(); i++)
        {
            int temp = 0;
            for (int money : accounts[i])
                temp += money;
            maxsum = max(temp, maxsum);
        }
        return maxsum;
    }
};

1673. Find the Most Competitive Subsequence

1674. Minimum Moves to Make Array Complementary

1675. Minimize Deviation in Array

weekly contest 218

2020.12.06 今天不想学习。每天都不想学习

1678. Goal Parser Interpretation

1679. Max Number of K-Sum Pairs

1680. Concatenation of Consecutive Binary Numbers

1681. Minimum Incompatibility

weekly contest 219

2020.12.13 今天睡了懒觉

1688. Count of Matches in Tournament

n个队伍打比赛,两两比赛,每次淘汰败者,决出冠军一共要打多少场比赛?

因为要淘汰n-1个队,所以打n-1场。

1689. Partitioning Into Minimum Number Of Deci-Binary Numbers

class Solution
{
public:
    int minPartitions(string n)
    {
        char maxch = '0';
        for (int i = 0; i < n.size(); i++)
        {
            maxch = max(n[i], maxch);
        }

        return maxch - '0';
    }
};

1690. Stone Game VII

1691. Maximum Height by Stacking Cuboids

weekly contest 220

2020.12.19 床实在是太粘人了

1694. Reformat Phone Number

class Solution
{
public:
    string reformatNumber(string number)
    {
        string v;
        for (int i = 0; i < number.size(); i++)
        {
            if (number[i] >= '0' && number[i] <= '9')
            {
                v += number[i];
            }
        }
        int n = v.size();
        string ret;
        int i = 0;
        while (n > 4)
        {
            ret += v.substr(i, 3) + "-";
            i += 3;
            n -= 3;
        }
        if (n == 4)
        {
            ret += v.substr(i, 2) + "-" + v.substr(i + 2, 2);
        }
        else
        {
            ret += v.substr(i, n);
        }
        return ret;
    }
};

[1695. Maximum Erasure Value

](https://leetcode.com/problems/checking-existence-of-edge-length-limited-paths/)

求不重复的连续字串,sum最大

class Solution
{
public:
    int maximumUniqueSubarray(vector<int> &nums)
    {
        int start = 0;
        int end = 0;
        set<int> temp;
        int maxret = 0;
        int sum = 0;
        while (end < nums.size())
        {
            while (temp.count(nums[end]))
            {
                temp.erase(nums[start]);
                sum -= nums[start];
                start++;
            }
            sum += nums[end];
            temp.insert(nums[end]);
            end++;
            if (maxret < sum)
                maxret = sum;
        }
        return maxret;
    }
};

1696. Jump Game VI

1697. Checking Existence of Edge Length Limited Paths

weekly contest 221

1704. Determine if String Halves Are Alike

没啥花头

class Solution
{
public:
    bool halvesAreAlike(string s)
    {

        set<char> chs = {'a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U'};
        int count1 = 0;
        int count2 = 0;

        for (int i = 0; i < s.length() / 2; i++)
        {
            if (chs.count(s[i]))
                count1++;
        }
        for (int i = s.length() / 2; i < s.length(); i++)
        {
            if (chs.count(s[i]))
                count2++;
        }
        return count1 == count2;
    }
};

1705. Maximum Number of Eaten Apples

1706. Where Will the Ball Fall

1707. Maximum XOR With an Element From Array

© 皖ICP备20011981号