• leetcode第 387 场周赛总结


    很久没打周赛了,这周开始恢复

    这次周赛,题目比较简单,第三道题有点浪费了时间,思路是对的,但是被我把问题复杂化了。


    给你一个下标从 1 开始、包含 不同 整数的数组 nums ,数组长度为 n 。

    你需要通过 n 次操作,将 nums 中的所有元素分配到两个数组 arr1 和 arr2 中。在第一次操作中,将 nums[1] 追加到 arr1 。在第二次操作中,将 nums[2] 追加到 arr2 。之后,在第 i 次操作中:

    • 如果 arr1 的最后一个元素 大于 arr2 的最后一个元素,就将 nums[i] 追加到 arr1 。否则,将 nums[i] 追加到 arr2 。

    通过连接数组 arr1 和 arr2 形成数组 result 。例如,如果 arr1 == [1,2,3] 且 arr2 == [4,5,6] ,那么 result = [1,2,3,4,5,6] 。

    返回数组 result 。

    第一道简单题,可以通过slice(-1)获取最新插入的数,进行比较分别操作即可,没什么好说的。 

    1. /**
    2. * @param {number[]} nums
    3. * @return {number[]}
    4. */
    5. var resultArray = function(nums) {
    6. let arr1=[];
    7. let arr2=[];
    8. let result=[];
    9. let n=nums.length;
    10. if(n==0){
    11. return result;
    12. }
    13. arr1.push(nums[0]);
    14. arr2.push(nums[1]);
    15. for(let i=2;i
    16. let num1=arr1.slice(-1);
    17. let num2=arr2.slice(-1);
    18. if(num1-num2>0){
    19. arr1.push(nums[i]);
    20. }else{
    21. arr2.push(nums[i]);
    22. }
    23. }
    24. result.push(...arr1,...arr2);
    25. return result;
    26. };

     

    给你一个下标从 0 开始的整数矩阵 grid 和一个整数 k

    返回包含 grid 左上角元素、元素和小于或等于 k 的 子矩阵 的数目。

    这道题其实就是个简单的二维前缀和,也很简单。因为每个矩阵需要包含左上角第一个元素,所以直接从左上角开始填表计算前缀和并不断更新最大值就可以了。

    1. /**
    2. * @param {number[][]} grid
    3. * @param {number} k
    4. * @return {number}
    5. */
    6. var countSubmatrices = function(grid, k) {
    7. let n=grid.length;
    8. let m=grid[0].length;
    9. let cnt=0;
    10. const dp=new Array(n+1).fill(0).map(()=>new Array(m+1).fill(0))
    11. for(let i=1;i<=n;i++){
    12. for(let j=1;j<=m;j++){
    13. dp[i][j]=dp[i-1][j]+dp[i][j-1]-dp[i-1][j-1]+grid[i-1][j-1];
    14. if(dp[i][j]<=k)cnt++;
    15. }
    16. }
    17. return cnt;
    18. };

     

    这道题其实也很简单,关键是数据量很小,矩阵最大才49*49;数值只可能是0,1,2;

    而且Y的位置是随n的大小固定的,所以我们只需要统计出Y内的0,1,2的数量以及整个矩阵的0,1,2的数量,然后计算出最小操作数就可以了。比赛的时候这道题我稍微想复杂了一点,其实没必要得到整体的数字情况和Y内的数字情况后再计算出Y外的数字情况来计算。

    这里我已经改进了,但主要还是提供一个思路,就不把修改后的代码贴出来了,如果不会这道题可以顺着我的思路自己做出来。 

    1. /**
    2. * @param {number[][]} grid
    3. * @return {number}
    4. */
    5. var minimumOperationsToWriteY = function(grid) {
    6. let n = grid.length;
    7. let x = Math.floor(n / 2);//中心点坐标
    8. //数值只有0,1,2三种
    9. let inner = [0, 0, 0];
    10. let all = [0, 0, 0];
    11. let outer = [0, 0, 0];
    12. for (let i = 0; i < x; i++) {
    13. inner[grid[i][i]]++;//第一笔
    14. inner[grid[i][n - 1 - i]]++;//第二笔
    15. inner[grid[n - 1 - i][x]]++; // 第三笔
    16. }
    17. inner[grid[x][x]]++;//中心点
    18. for (let i = 0; i < n; i++) {
    19. for (let j = 0; j < n; j++) {
    20. all[grid[i][j]]++;
    21. }
    22. }
    23. for (let i = 0; i < 3; i++) {
    24. outer[i] = all[i] - inner[i];
    25. }//这里其实没必要计算outer
    26. let res = Math.min(inner[1] + inner[2] + outer[0] + Math.min(outer[1], outer[2]))
    27. res = Math.min(res, Math.min(inner[0] + inner[2] + outer[1] + Math.min(outer[0], outer[2])))
    28. res = Math.min(res, Math.min(inner[1] + inner[0] + outer[2] + Math.min(outer[1], outer[0])))
    29. return res;
    30. };
  • 相关阅读:
    90 子集II
    团结引擎已全面支持 OpenHarmony 操作系统
    Spring Boot - devtools 热部署
    代码随想录算法训练营Day49|贪心算法8
    延时消息队列
    Delphi+DIYGW开发小程序
    【考研高数 武忠祥+880版 自用】高数第三章基础阶段思维导图
    什么是b3dm?b3dm详解
    【三等奖方案】小样本数据分类任务赛题「复兴15号」团队解题思路
    专业技术人员的几种有效的薪酬制度模式
  • 原文地址:https://blog.csdn.net/m0_62742402/article/details/136429231