第 387 场周赛第一次AK记录

100243. 将元素分配到两个数组中 I

  • 题意在这里插入图片描述- 思路
    直接看代码

  • 代码

class Solution {
public:
    vector<int> resultArray(vector<int>& nums) {
        vector<int> arr1,arr2;
        arr1.push_back(nums[0]);
        arr2.push_back(nums[1]);
        for (int i = 2;i < nums.size();i ++) {
            if (arr1[arr1.size()-1] > arr2[arr2.size()-1]) 
                arr1.push_back(nums[i]);
            else 
                arr2.push_back(nums[i]);
        }
        vector<int> result;
        for (auto &a:arr1)
            result.push_back(a);
        for (auto &b:arr2) 
            result.push_back(b);
        return result;
    }
};

100237. 元素和小于等于 k 的子矩阵的数目

  • 题意
    在这里插入图片描述

  • 思路
    二维前缀和

  • 代码

class Solution {
public:
    int countSubmatrices(vector<vector<int>>& grid, int k) {
        vector<vector<int>> grids;
        int m = grid.size();
        int n = grid[0].size();
        grids.resize(m);
        for (int i = 0;i < m;i ++)
            grids[i].resize(n);
        grids[0][0] = grid[0][0];
        for (int i = 1;i < n;i ++)
            grids[0][i] += grids[0][i-1] + grid[0][i];
        for (int i = 1;i < m;i ++)
            grids[i][0] += grids[i-1][0] + grid[i][0];
        for (int i = 1;i < m;i ++) 
            for (int j = 1;j < n;j ++) 
                grids[i][j] = grids[i-1][j] + grids[i][j-1] + grid[i][j] - grids[i-1][j-1];
        int sum = 0;
        for (int i = 0;i < m;i ++) 
            for (int j = 0;j < n;j ++) 
                if (grids[i][j] <= k)
                    sum ++;
        return sum;
    } 
};

100234. 在矩阵上写出字母 Y 所需的最少操作次数

  • 题意

  • 思路
    枚举每一种可能
    在这里插入图片描述

  • 代码

class Solution {
public:
    int minimumOperationsToWriteY(vector<vector<int>>& grid) {
        int n = grid.size();
        int y[3] = {0};
        int _y[3] = {0};
        for (int i = 0;i < n;i ++) 
            for (int j = 0;j < n;j ++)
            {
                if (grid[i][j] == 0) _y[0] ++;
                if (grid[i][j] == 1) _y[1] ++;
                if (grid[i][j] == 2) _y[2] ++;
                if (grid[i][j] == 0 && (((i<=n/2)&&(i == j||j+i==n-1))||(i>n/2&&j == n/2))) y[0]++;
                if (grid[i][j] == 1 && (((i<=n/2)&&(i == j||j+i==n-1))||(i>n/2&&j == n/2))) y[1]++;
                if (grid[i][j] == 2 && (((i<=n/2)&&(i == j||j+i==n-1))||(i>n/2&&j == n/2))) y[2]++;
            }
        _y[0] -= y[0];
        _y[1] -= y[1];
        _y[2] -= y[2];
        // return y[0]
        // return y[1];
        // return y[2];
        int ans = n*n;
        for (int i = 0;i < 3;i ++) 
            for (int j = 0;j < 3;j ++) 
            {
                if (i == j) continue;
                int tans = n+n/2-y[i];
                tans += (n*n-n-n/2) - _y[j];
                if (tans < ans) ans = tans;
            }
        return ans;
    }
};

100246. 将元素分配到两个数组中2

  • 题意
    在这里插入图片描述

  • 思路
    离散化+树状数组

  • 代码

class Solution {
public:
    int n;
    vector<int> num1,bit1,bit2;
    vector<int> resultArray(vector<int>& nums) {
        n = nums.size();
        vector<int> num1;num1.resize(nums.size());
        num1 = nums;
        sort(num1.begin(),num1.end());
        map<int,int> mp,mp2;
        int t = 1;
        mp[num1[0]] = 1;mp2[1] = num1[0];
        for (int i = 1;i < n;i ++)
        {
            if (num1[i] == num1[i-1]) {
                mp[num1[i]] = t;
                mp2[t] = num1[i];
            }
            else {
                t = i+1;
                mp[num1[i]] = t;
                mp2[t] = num1[i];
            }
        }
        for (int i = 0;i < n;i ++) 
            num1[i] = mp[nums[i]];
        this->num1.resize(n+1);
        bit1.resize(n+1);
        bit2.resize(n+1);
        vector<int> arr1,arr2;
        n = num1.size();
        arr1.push_back(num1[0]);add1(num1[0],1);
        arr2.push_back(num1[1]);add2(num1[1],1);
        // return arr2;
        for (int i = 2;i < n;i ++) {
            if (arr1.size()-sum1(num1[i]) > arr2.size()-sum2(num1[i])) {
                arr1.push_back(num1[i]);
                add1(num1[i],1);
            }
            else if (arr1.size()-sum1(num1[i]) < arr2.size()-sum2(num1[i])) {
                arr2.push_back(num1[i]);add2(num1[i],1);
            } else if (arr1.size()-sum1(num1[i]) == arr2.size()-sum2(num1[i])) {
                if (arr1.size() <= arr2.size()) {
                    arr1.push_back(num1[i]);
                    add1(num1[i],1);
                }
                else if (arr1.size() > arr2.size()) {
                    arr2.push_back(num1[i]);add2(num1[i],1);
                }
            }
        }
        vector<int> result;
        for (auto a:arr1) result.push_back(mp2[a]);
        for (auto b:arr2) result.push_back(mp2[b]);
        return result;
    }
    int lowbit(int x) {
        return x & -x;
    }
    void add1(int x, int v) {
        for (int i = x; i <= n; i += lowbit(i)) {
            bit1[i] += v;
        }
    }
    int sum1(int x) {
        int ret = 0;
        for (int i = x; i > 0; i -= lowbit(i)) {
            ret += bit1[i];
        }
        return ret;
    }
    void add2(int x, int v) {
        for (int i = x; i <= n; i += lowbit(i)) {
            bit2[i] += v;
        }
    }
    int sum2(int x) {
        int ret = 0;
        for (int i = x; i > 0; i -= lowbit(i)) {
            ret += bit2[i];
        }
        return ret;
    }
};

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

疯狂的码泰君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值