力扣 第 387 场周赛 解题报告 | 珂学家 | 离散化树状数组 + 模拟场


前言

image.png


整体评价

手速场+模拟场,思路和解法都蛮直接的。

所以搞点活

  • 如果T2,如果不固定左上角,批量查询某个点为左上角,求满足总和 ≤ k \le k k的子矩阵个数

  • 如果T2,如果不固定左上角,求总和 ≤ k \le k k的子矩阵个数

  • 如果T3, 数值不局限于0,1,2, 求最小操作数


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

思路: 模拟

模拟即可,没啥可说的。

class Solution {public int[] resultArray(int[] nums) {List<Integer> r1 = new ArrayList<>(List.of(nums[0]));List<Integer> r2 = new ArrayList<>(List.of(nums[1]));for (int i = 2; i < nums.length; i++) {if (r1.get(r1.size() - 1) > r2.get(r2.size() - 1)) {r1.add(nums[i]);} else {r2.add(nums[i]);}}r1.addAll(r2);return r1.stream().mapToInt(Integer::valueOf).toArray();}
}

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

思路: 二维前缀和 + 枚举

因为固定左上角,所以子矩阵的个数为 n ∗ m n * m nm

前缀和预处理, O ( n ∗ m ) O(n * m) O(nm)

枚举子矩阵为, O ( n ∗ m ) O(n * m) O(nm)

class Solution {public int countSubmatrices(int[][] grid, int k) {int h = grid.length, w = grid[0].length;long[][] pre = new long[h + 1][w + 1];for (int i = 0; i < h; i++) {for (int j = 0; j < w; j++) {pre[i + 1][j + 1] = pre[i + 1][j] + pre[i][j + 1] - pre[i][j] + grid[i][j];}}int res = 0;for (int i = 0; i < h; i++) {for (int j = 0; j < w; j++) {if (pre[i + 1][j + 1] <= k) {res ++;}}}return res;}
}

思考:

如果左上角并不固定,而且以任意点出发,求满足要求的子矩阵数? 而且这个查询量不小?

那面对这个问题,该如何求解呢?

感觉一次查询,可以从 O ( n ∗ m ) 优化为 O ( n + m ) O(n * m) 优化为 O(n+m) O(nm)优化为O(n+m),就是从右上点出发,逐渐收敛到左下。


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

思路: 模拟 + 枚举组合

唯一可以增加难度的是,不限定数值范围

不过这也才基本的nlargest问题

class Solution {boolean isJudge(int y, int x, int n) {if (y == x && y <= n / 2) {return true;}if (y + x == n - 1 && y <= n / 2) {return true;}if (y >= n / 2 && x == n / 2) {return true;}return false;}public int minimumOperationsToWriteY(int[][] grid) {int n = grid.length;int[] ys = new int[3];int[] nys = new int[3];for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {int id = grid[i][j];if (isJudge(i, j, n)) {ys[id]++;} else {nys[id]++;}}}// 枚举即可int res = n * n;int totYs = n/2 + n/2 + n/2 + 1;int totNys = n * n - totYs;for (int i = 0; i < 3; i++) {for (int j = 0; j < 3; j++) {if (i != j) {res = Math.min(res, (totYs - ys[i]) + (totNys - nys[j]));}}}return res;}}

D. 将元素分配到两个数组中 II

思路:离散化 + 树状数组

板子题,而且非常的直接

class Solution {static class BIT {int n;int[] arr;public BIT(int n) {this.n =n;this.arr = new int[n + 1];}int query(int p) {int res = 0;while (p > 0) {res += arr[p];p -= p & -p;}return res;}void update(int p, int d) {while (p <= n) {arr[p] += d;p += p & -p;}}}public int[] resultArray(int[] nums) {List<Integer> arr1 = new ArrayList<>(List.of(nums[0]));List<Integer> arr2 = new ArrayList<>(List.of(nums[1]));// 离散化过程TreeSet<Integer> ts = new TreeSet<>();for (int v: nums) ts.add(v);int ptr = 1;Map<Integer, Integer> idMap = new HashMap<>();for (var k: ts) {idMap.put(k, ptr++);}// 树状数组模拟过程BIT bit1 = new BIT(ptr);BIT bit2 = new BIT(ptr);bit1.update(idMap.get(nums[0]), 1);bit2.update(idMap.get(nums[1]), 1);for (int i = 2; i < nums.length; i++) {int v = nums[i];Integer k = idMap.get(v);int cnt1 = bit1.query(ptr) - bit1.query(k);int cnt2 = bit2.query(ptr) - bit2.query(k);if (cnt1 > cnt2 || (cnt1 == cnt2 && arr2.size() >= arr1.size())) {arr1.add(v);bit1.update(k, 1);} else {arr2.add(v);bit2.update(k, 1);} }arr1.addAll(arr2);return arr1.stream().mapToInt(Integer::valueOf).toArray();}
}

写在最后

image.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/509321.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

老年人居家安全问题,全视通社区居家养老解决方案来赋能

近年来&#xff0c;老年人居家环境问题逐渐受到社会的关注。从新闻报道得知&#xff0c;传统居家环境对老年人存在诸多挑战&#xff0c;比如在入户空间、起居&#xff08;室&#xff09;厅、卧室、卫生间、厨房等区域。这些挑战不仅影响老年人的生活质量&#xff0c;还可能导致…

【大厂AI课学习笔记NO.60】(13)模型泛化性的评价

我们学习了过拟合和欠拟合&#xff0c;具体见我的文章&#xff1a;https://giszz.blog.csdn.net/article/details/136440338 那么今天&#xff0c;我们来学习模型泛化性的评价。 泛化性的问题&#xff0c;我们也讨论过了&#xff0c;那么如何评价模型的泛化性呢&#xff1f; …

vue 常用的 UI 组件库之一:Vuetify组件库

Vuetify是一个基于Vue.js 的Material Design组件库&#xff0c;它提供了一套完整的、预构建的、可自定义的、响应式的组件&#xff0c;以便开发者可以快速构建美观且功能强大的Web应用程序。Vuetify遵循Material Design设计指南&#xff0c;提供了一系列易于使用的组件&#xf…

[项目设计] 从零实现的高并发内存池(二)

&#x1f308; 博客个人主页&#xff1a;Chris在Coding &#x1f3a5; 本文所属专栏&#xff1a;[高并发内存池] ❤️ 前置学习专栏&#xff1a;[Linux学习] ⏰ 我们仍在旅途 ​ 目录 2.高并发内存池整体架构 3.ThreadCache实现 3.1 ThreadCache整体架构…

这是开玩笑吗?加个工具,WPS与Excel表格变成了应用系统

表格处理数据简单快捷&#xff0c;是个人用户的首选。然而&#xff0c;当企业长期使用&#xff0c;成本表、客户表、销售表等堆积如山&#xff0c;寻找所需表格如同大海捞针&#xff0c;稍有不慎便可能导致数据丢失、混乱。即便使用WPS和Excel这样的表格软件&#xff0c;处理大…

Harmony OS 父子组件传参

Harmony OS 父子组件传参案例 一、Prop&#xff1a;从父组件单向同步状态 类似于vue的prop传参&#xff0c;只能父组件传参给子组件 当点击父组件的按钮时&#xff0c;改变message值&#xff0c;参数跟着更新。并且子组件也跟着更新&#xff08;前提是要子组件加上prop装饰器…

力扣hot100:1.两数之和

输入中可能存在重复值 。 分析&#xff1a; 本题需要返回的是数组下标&#xff0c;因此如果需要使用排序然后双指针的话&#xff0c;需要用到哈希表&#xff0c;但是由于输入中可能存在重复值&#xff0c;因此哈希表的value值必须是vector<int>。 使用双指针求目标值targ…

Ansible setup 模块 该模块主要用于收集信息,是通过调用facts组件来实现的。

目录 作用查看信息验证保存信息验证 作用 该模块主要用于收集信息&#xff0c;是通过调用facts组件来实现的。   facts组件是Ansible用于采集被管机器设备信息的一个功能&#xff0c;我们可以使用setup模块查机器的所有facts信息&#xff0c;可以使用filter来查看指定信息。…

【系统维护】-微软电脑管家官网

以前没注意&#xff0c;最近一次升级后给安装了微软电脑管家&#xff0c;特别是瘦身功能感觉比较好&#xff0c;以前总是装第三方或者用命令行情况&#xff0c;有时候不小心还会给系统搞崩溃。感觉这个会安全很多。 还有其他一些功能&#xff0c;建议感兴趣的的可以试一下&…

Axure导入使用ElementUI组件库

在使用Axure进行UI设计时&#xff0c;我们可能导入ElementUI组件库或者一些其他的元件库&#xff0c;其实非常简单&#xff0c;如果你还没有装好Axure可以先安装好AxureRP9汉化版&#xff0c;接下来&#xff0c;我们以AxureRP9汉化版来演示如何导入ElementUI组件库。 第一步&a…

CMake 生成器

关于 CMake 的讨论已有不少&#xff0c;因为 CMake 无疑是一个伟大的工具。如果你搜索“CMake”&#xff0c;你肯定会看到这样一句话&#xff1a;“CMake 不是一个构建系统&#xff0c;而是一个构建系统生成器”。因此&#xff0c;本篇文章的内容主要围绕什么是 CMake 生成器&a…

低代码开发平台优势揭秘 | 提升应用程序开发效率

低代码开发平台是指不用编码或少量编码即可快速产生应用程序的开发平台。依据平台的可视化开发方式&#xff0c;具有不同经验水准的开发者能通过图型操作面板、系统软件拖拽组件和模型驱动思维创建网页和移动应用程序。低代码开发平台在如今企业数字化的蓬勃发展中发挥着不可替…