力扣第 196 场周赛总结

一、判断能否形成等差数列

1、题目描述:

力扣第 196 场周赛总结_第1张图片

2、题解

排序后,遍历,进行判断后一个-前一个的值是否都相等,只要有一个不相等,那么就返回False。

class Solution:
    def canMakeArithmeticProgression(self, arr: List[int]) -> bool:
        arr.sort()
        res = arr[1] - arr[0]
        for i in range(2,len(arr)):
            if arr[i] - arr[i-1] != res:
                return False
        return True

二、所有蚂蚁掉下来前的最后一刻

1、题目描述:

力扣第 196 场周赛总结_第2张图片
力扣第 196 场周赛总结_第3张图片
力扣第 196 场周赛总结_第4张图片
力扣第 196 场周赛总结_第5张图片

2、题解:

事实上,可以认为两只蚂蚁相遇后,保持原样交错而过继续前进。可以认为每只蚂蚁都是独立运动的。所以要求最大时长,就是求蚂蚁到杆子端点的最大距离。

class Solution:
    def getLastMoment(self, n: int, left: List[int], right: List[int]) -> int:
        res = 0
        for i in left:
            res = max(res,i)
        for j in right:
            res = max(res,n-j)
        return res

三、统计全 1 子矩形

1、题目描述:

力扣第 196 场周赛总结_第6张图片
力扣第 196 场周赛总结_第7张图片

2、题解:

动态规划
矩阵里每个点(i.j)统计他这行左边到他这个位置最多有几个连续的1,存为left[i][j]。然后对于每个点(i.j),我们固定子矩形的右下角为(i.j),利用left从该行i向上寻找子矩阵左上角为第k行的矩阵个数。每次将子矩阵个数加到答案中即可。
时间复杂度O(nnm),空间复杂度O(nm)。

class Solution {
public:
    int numSubmat(vector<vector<int>>& mat) {
        int n = mat.size();
        int m = mat[0].size();
        vector<vector<int> > left(n,vector<int>(m));
        int now = 0;
        for(int i=0;i<n;i++){
            now = 0;
            for(int j=0;j<m;j++){
                if(mat[i][j] == 1) now ++;
                else now = 0;
                left[i][j] = now;
            }
        }
        int ans = 0,minx;
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                minx = 0x3f3f3f3f;
                for(int k=i;k>=0;k--){
                    minx = min(left[k][j],minx);
                    ans += minx;
                }
            }
        }
        return ans;
    }
};

四、最多 K 次交换相邻数位后得到的最小整数

1、题解描述:

力扣第 196 场周赛总结_第8张图片
力扣第 196 场周赛总结_第9张图片

2、题解:

贪心算法
本题可能没有想象中的那么难,采用贪心的思想,每次循环查找最小的值,然后将其交换到前面。需要注意的是,循环的最大范围不能超过k+1.
输入给的k的范围太大了,采用贪心会tle。刚开始进行判断,如果num的size的平方比k小,那么直接sort即可。

class Solution {
public:
    string minInteger(string num, int k) {
        if (k == 0)
            return num;
        //special return
        if (num.size() * num.size() < k) {
            sort(num.begin(), num.end());
            return num;
        }
        for (int i = 0; i < num.size(); i++) {
            char tem = num[i];
            int flag = 0;
            int index;
            //find minChar
            for (int j = i + 1; j < i + 1 + k && j < num.size(); j++) {
                if (num[j] < tem) {
                    //update
                    tem = num[j];
                    flag = 1;
                    index = j;
                }
            }
            if (flag) {
                //loop swap update
                for (int t = index; t >= i + 1; t--) {
                    char temp = num[t];
                    num[t] = num[t - 1];
                    num[t - 1] = temp;
                }
                flag = 0;
                k = k - (index - i);
            }
            //return
            if (k == 0)
                break;
        }
        return num;
    }
};

你可能感兴趣的:(LeetCode)