首页 > 其他分享 >20220626leetcode周赛(前3道)

20220626leetcode周赛(前3道)

时间:2023-04-22 14:01:08浏览次数:52  
标签:周赛 数组 int dp 放置 20220626leetcode nums1 nums2

title: 20220622leetcode周赛(前3道)

第一题,难度:简单

6101. 判断矩阵是否是一个 X 矩阵

题目描述:

如果一个正方形矩阵满足下述 全部 条件,则称之为一个 X 矩阵 :

矩阵对角线上的所有元素都 不是 0
矩阵中所有其他元素都是 0
给你一个大小为 n x n 的二维整数数组 grid ,表示一个正方形矩阵。如果 grid 是一个 X 矩阵 ,返回 true ;否则,返回 false 。

示例 1:

输入:grid = [[2,0,0,1],[0,3,1,0],[0,5,2,0],[4,0,0,2]]
输出:true
解释:矩阵如上图所示。
X 矩阵应该满足:绿色元素(对角线上)都不是 0 ,红色元素都是 0 。
因此,grid 是一个 X 矩阵。
示例 2:

输入:grid = [[5,7,0],[0,3,1],[0,5,0]]
输出:false
解释:矩阵如上图所示。
X 矩阵应该满足:绿色元素(对角线上)都不是 0 ,红色元素都是 0 。
因此,grid 不是一个 X 矩阵。

提示:

n == grid.length == grid[i].length
3 <= n <= 100
0 <= grid[i][j] <= 10^5

代码如下:

bool checkXMatrix(int** grid, int gridSize, int* gridColSize){
    int col = gridColSize[0];
    int i, j;
    for (i = 0; i < gridSize; ++i) {
        for (j = 0; j < col; ++j) {
            if (i == j || j == gridSize - 1 - i) {
                if (grid[i][j] == 0) {
                    return false;
                }
            } else {
                if (grid[i][j] != 0) {
                    return false;
                }
            }
            
        }
    }
    return true;
}

第二题,难度:中等

6100. 统计放置房子的方式数

题目描述:

一条街道上共有 n * 2 个 地块 ,街道的两侧各有 n 个地块。每一边的地块都按从 1 到 n 编号。每个地块上都可以放置一所房子。

现要求街道同一侧不能存在两所房子相邻的情况,请你计算并返回放置房屋的方式数目。由于答案可能很大,需要对 109 + 7 取余后再返回。

注意,如果一所房子放置在这条街某一侧上的第 i 个地块,不影响在另一侧的第 i 个地块放置房子。

示例 1:

输入:n = 1
输出:4
解释:
可能的放置方式:

  1. 所有地块都不放置房子。
  2. 一所房子放在街道的某一侧。
  3. 一所房子放在街道的另一侧。
  4. 放置两所房子,街道两侧各放置一所。
    示例 2:

输入:n = 2
输出:9
解释:如上图所示,共有 9 种可能的放置方式。

提示:

1 <= n <= 10^4

思路如下:

一侧房子的放置不影响另一侧房子的放置情况,所以先单独看其中一侧房子的放置方案。

dp[n]表示前n块地房子的放置方案数。

第n块地有两种放置方案,放房子或者不放房子:

不放房子的话,和dp[n-1]方案数一致;

放房子的话,第n-1块地一定是不放房子的(确定的),则和dp[n-2]方案数一致。

dp[n] = dp[n-1] + dp[n-2]

dp[0] = 1, 空也是一种放置方案

dp[1] = 2, 放置房子或者不放置房子

在一侧的dp[n]中选择其中一种方案,另一侧仍然是dp[n]种方案

所以总方案数是:dp[n] * dp[n]

代码如下:

#define MOD 1000000007

int countHousePlacements(int n){
    long *dp = (long *)malloc(sizeof(long) * (n + 2));
    dp[0] = 1;
    dp[1] = 2;
    for (int i = 2; i < n + 2; i++) {
        dp[i] = (dp[i - 1] + dp[i - 2]) % MOD;
    }
    return (int)(dp[n] * dp[n] % MOD);
}

第三题,难度:困难

5229. 拼接数组的最大分数

题目描述:

给你两个下标从 0 开始的整数数组 nums1 和 nums2 ,长度都是 n 。

你可以选择两个整数 left 和 right ,其中 0 <= left <= right < n ,接着 交换 两个子数组 nums1[left...right] 和 nums2[left...right] 。

例如,设 nums1 = [1,2,3,4,5] 和 nums2 = [11,12,13,14,15] ,整数选择 left = 1 和 right = 2,那么 nums1 会变为 [1,12,13,4,5] 而 nums2 会变为 [11,2,3,14,15] 。
你可以选择执行上述操作 一次 或不执行任何操作。

数组的 分数 取 sum(nums1) 和 sum(nums2) 中的最大值,其中 sum(arr) 是数组 arr 中所有元素之和。

返回 可能的最大分数 。

子数组 是数组中连续的一个元素序列。arr[left...right] 表示子数组包含 nums 中下标 left 和 right 之间的元素(含 下标 left 和 right 对应元素)。

示例 1:

输入:nums1 = [60,60,60], nums2 = [10,90,10]
输出:210
解释:选择 left = 1 和 right = 1 ,得到 nums1 = [60,90,60] 和 nums2 = [10,60,10] 。
分数为 max(sum(nums1), sum(nums2)) = max(210, 80) = 210 。
示例 2:

输入:nums1 = [20,40,20,70,30], nums2 = [50,20,50,40,20]
输出:220
解释:选择 left = 3 和 right = 4 ,得到 nums1 = [20,40,20,40,20] 和 nums2 = [50,20,50,70,30] 。
分数为 max(sum(nums1), sum(nums2)) = max(140, 220) = 220 。
示例 3:

输入:nums1 = [7,11,13], nums2 = [1,1,1]
输出:31
解释:选择不交换任何子数组。
分数为 max(sum(nums1), sum(nums2)) = max(31, 3) = 31 。

提示:

n == nums1.length == nums2.length
1 <= n <= 10^5
1 <= nums1[i], nums2[i] <= 10^4

思路如下:

可以参考最长子序列和的题目

先求出nums1和nums2数组的和,以及两数组相同下标数的差值

sub数组表示nums1数组 - nums2数组的差值

然后对sbu数组中的正数求最大子序列和,对sub数组中的负数求最小子序列和

最后返回(sum1-最小子序列和,sum2+最大子序列和)两者的最大值

代码如下:

#define MIN_NUM 0
#define MAX_NUM 10000
#define MAX_LENGTH 100000

int maximumsSplicedArray(int* nums1, int nums1Size, int* nums2, int nums2Size){
    int sub[MAX_LENGTH] = { 0 };
    int sum1 = 0;
    int sum2 = 0;
    for (int i = 0; i < nums1Size; ++i) {
        sub[i] = nums1[i] - nums2[i];
        sum1 += nums1[i];
        sum2 += nums2[i];
    }
    int s1 = 0;
    int s1Max = MIN_NUM;
    int s2 = 0;
    int s2Min = MAX_NUM;
    for (int i = 0; i < nums1Size; ++i) {
        s1 = s1 < 0 ? sub[i] : s1 + sub[i];
        s1Max = s1 > s1Max ? s1 : s1Max;
        s2 = s2 > 0 ? sub[i] : s2 + sub[i];
        s2Min = s2 < s2Min ? s2 : s2Min;
    }
    return sum1 - s2Min > sum2 + s1Max ? sum1 - s2Min : sum2 +s1Max;
}

标签:周赛,数组,int,dp,放置,20220626leetcode,nums1,nums2
From: https://www.cnblogs.com/blue-Suri/p/17342955.html

相关文章

  • LeetCode 周赛 341 场,模拟 / 树上差分 / Tarjan 离线 LCA / DFS
    本文已收录到AndroidFamily,技术和职场问题,请关注公众号[彭旭锐]提问。大家好,我是小彭。上周末有单双周赛,双周赛我们讲过了,单周赛那天早上有事没参加,后面做了虚拟竞赛,然后整个人就不好了。前3题非常简单,但第4题有点东西啊,差点就放弃了。最后,被折磨了一个下午和一个大夜......
  • CodeStar2023年春第5周周赛普及进阶组
    T1:分段求平均数本题难度中等,划分型DP问题。用dp[i]表示前\(i\)个数最少划分成几段,对\(j=1,2,\cdots,i-1\)判断从\(a_j\)到\(a_i\)划分成一段时,平均数是否为整数,如果是整数,就更新\(dp[i]=\max(dp[i],dp[j-1]+1)\)初始值:\(dp[i]=i\)代码实现#include<b......
  • 第341场周赛
    1.一最多的行送分题classSolution{public:vector<int>rowAndMaximumOnes(vector<vector<int>>&mat){intm=mat.size();intn=mat[0].size();intres=0;intindex=0;for(inti=0;i<m;i++){......
  • LeetCode 双周赛 102,模拟 / BFS / Dijkstra / Floyd
    本文已收录到AndroidFamily,技术和职场问题,请关注公众号[彭旭锐]提问。大家好,欢迎来到小彭的LeetCode周赛解题报告。昨晚是LeetCode双周赛第102场,你参加了吗?这场比赛比较简单,拼的是板子手速,继上周掉大分后算是回了一口血......
  • LeetCode 周赛 340,质数 / 前缀和 / 极大化最小值 / 最短路 / 平衡二叉树
    本文已收录到AndroidFamily,技术和职场问题,请关注公众号[彭旭锐]提问。大家好,我是小彭。上周跟大家讲到小彭文章风格的问题,和一些朋友聊过以后,至少在算法题解方面确定了小彭的风格。虽然竞赛算法题的文章受众非常小,但却有很多像我一样的初学者,他们有兴趣参加但容易被题目难......
  • CodeStar2023年春第4周周赛普及奠基组
    T1:字符串加密(二)本题难度简单,是一个模拟题,注意\(k\)可能非常大,需要先模\(26\)。代码实现#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;intmain(){stringm;cin>>m;llk;cin>>k;k%=26;stringans;......
  • AcWing 第 98 场周赛 ABC
    https://www.acwing.com/activity/content/competition/problem_list/3128/4947.大整数题目大意:给定n,k。输出n个k。输入样例:32输出样例:222#include<bits/stdc++.h>usingnamespacestd;typedeflonglongLL;typedefpair<LL,LL>PII;constLLMAXN=1e18,MINN=-M......
  • CodeStar2023年春第3周周赛普及奠基组
    T1:字符串加密本题难度简单,根据题目描述模拟即可。代码实现#include<bits/stdc++.h>usingnamespacestd;intmain(){strings;cin>>s;for(char&c:s){if(islower(c))c-=32;elsec+=32;}reverse(s.beg......
  • 校周赛-我左看右看上看下看 原来每个排列都不简单
    题目描述ABCDEFGBABCDEFCBABCDEDCBABCDEDCBABC这是一个5行7列的图形,请找出这个图形的规律,并输出一个n行m列的图形。输入格式输入一行,包含两个整数n和m,分别表示你要输出的图形的行数的列数。输出格式输出n行,每个m个字符,为你的图形。样例......
  • AcWing第97场周赛复盘总结
    4944.热身计算-AcWing题库给定两个正整数$a,b$,请你分别计算$\min(a,b)$以及$\lfloor\frac{|a-b|}{2}\rfloor$的值。$\lfloor\frac{|a-b|}{2}\rfloor$表示不大于$\frac{|a-b|}{2}$的最大整数。输入格式共一行,包含两个正整数$a,b$。输出格式共一......