算法小白的进阶之路(力扣9~12)

news2024/11/17 2:50:39

   💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。



非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨
 

前言

本栏目将记录博主暑假从0开始刷力扣的算法题,每一条题目我都会把知识点抽丝剥茧地进行分析,以便大家更好的理解和学习,话不多说,肝!

序号标题力扣序号
9重塑矩阵566
10区间加法598
11三个数最大乘积628
12错误的集合645

1.重塑矩阵

题目:

在 MATLAB 中,有一个非常有用的函数 reshape ,它可以将一个 m x n 矩阵重塑为另一个大小不同(r x c)的新矩阵,但保留其原始数据。

给你一个由二维数组 mat 表示的 m x n 矩阵,以及两个正整数 r 和 c ,分别表示想要的重构的矩阵的行数和列数。

重构后的矩阵需要将原始矩阵的所有元素以相同的 行遍历顺序 填充。

如果具有给定参数的 reshape 操作是可行且合理的,则输出新的重塑矩阵;否则,输出原始矩阵。

示例 1:

输入:mat = [[1,2],[3,4]], r = 1, c = 4
输出:[[1,2,3,4]]

示例 2:

输入:mat = [[1,2],[3,4]], r = 2, c = 4
输出:[[1,2],[3,4]]

解题思路:

  1. 检查维度兼容性:首先,需要确保原始矩阵nums的元素总数(即M * N)等于目标矩阵res的元素总数(即r * c)。如果两者不等,说明无法按照要求重塑矩阵,因此直接返回原始矩阵。

  2. 创建目标矩阵:如果维度兼容,则创建一个新的二维数组res,其大小为r x c,用于存储重塑后的矩阵。

  3. 遍历并填充目标矩阵:通过两层嵌套循环遍历原始矩阵nums的每个元素。外层循环遍历原始矩阵的行(i从0到M-1),内层循环遍历列(j从0到N-1)。

  4. 更新目标矩阵的索引:在遍历过程中,使用两个变量rowcol来跟踪目标矩阵res的当前填充位置。每当col达到c(即目标矩阵的列数),说明已经填满了一行,此时将row增加1以移到下一行,并将col重置为0。这样,res[row][col]就能正确地指向目标矩阵的下一个填充位置。

  5. 填充元素:在每次内层循环中,将原始矩阵nums的当前元素nums[i][j]赋值给目标矩阵res的对应位置res[row][col],然后递增col以指向下一个列位置。

  6. 返回结果:遍历完成后,返回填充好的目标矩阵res

int M = nums.length; // 获取原始矩阵的行数  
int N = nums[0].length; // 假设原始矩阵不是空矩阵,获取其列数  
if (M * N != r * c) { // 检查维度兼容性  
    return nums; // 如果维度不兼容,返回原始矩阵  
}  
int[][] res = new int[r][c]; // 创建一个新的二维数组,大小为r x c,用于存储重塑后的矩阵  
int row = 0, col = 0; // 初始化目标矩阵的填充位置索引  
for (int i = 0; i < M; i++) { // 外层循环遍历原始矩阵的行  
    for (int j = 0; j < N; j++) { // 内层循环遍历列  
        if (col == c) { // 如果已经填满了一行  
            row += 1; // 移到下一行  
            col = 0; // 重置列索引  
        }  
        res[row][col] = nums[i][j]; // 将原始矩阵的元素填充到目标矩阵的对应位置  
        col += 1; // 移到下一列  
    }  
}  
return res; // 返回重塑后的矩阵

2.区间加法

题目:

给你一个 m x n 的矩阵 M 和一个操作数组 op 。矩阵初始化时所有的单元格都为 0 。ops[i] = [ai, bi] 意味着当所有的 0 <= x < ai 和 0 <= y < bi 时, M[x][y] 应该加 1。

在 执行完所有操作后 ,计算并返回 矩阵中最大整数的个数 。

示例 :

输入: m = 3, n = 3,ops = [[2,2],[3,3]]
输出: 4
解释: M 中最大的整数是 2, 而且 M 中有4个值为2的元素。因此返回 4。

解题思路:

这道题其实不关心最大的值,而是关心次数,讲过小知识:在前端的知识里面,左上角为画面的默认值,所以重叠最多次。

这个问题实际上并不需要真正去模拟矩阵的加法操作或者构建一个真实的矩阵。关键在于理解操作数组 ops 对矩阵 M 的影响。每个操作 [ai, bi] 实际上是在说:“在矩阵的左上角 ai x bi 的子矩阵内的所有元素都应该加 1”。但是,由于所有元素初始都是 0,并且每个操作都是对整个子矩阵的加 1 操作,因此最终矩阵 M 的最大值将仅由操作数组 ops 中定义的最小 ai 和最小 bi 决定。

代码(Java)

class Solution {  
    public int maxCount(int m, int n, int[][] ops) {  
        // 遍历操作数组  
        for (int[] op : ops) {  
            // 更新 m 为当前 m 和操作数组中的 ai 的最小值  
            m = Math.min(m, op[0]);  
            // 更新 n 为当前 n 和操作数组中的 bi 的最小值  
            n = Math.min(n, op[1]);  
        }  
        // 返回最终矩阵中最大整数的个数,即 m * n  
        return m * n;  
    }  
}

假设我们有以下输入:

  • 矩阵的初始大小(虽然在这个问题中实际上并不重要,因为我们只关心操作数组):m = 5, n = 5(即一个 5x5 的矩阵,但所有元素初始都是 0)。
  • 操作数组 ops[[2, 3], [4, 2], [1, 5]]

现在,我们逐步执行代码:

  1. 初始化

    • m = 5
    • n = 5
    • ops = [[2, 3], [4, 2], [1, 5]]
  2. 开始遍历操作数组

    第一步(处理第一个操作 [2, 3]

    • m = Math.min(5, 2); -> m = 2(因为 2 是当前 m 和 op[0] 的最小值)。
    • n = Math.min(5, 3); -> n = 3(因为 3 是当前 n 和 op[1] 的最小值)。

    此时

    • m = 2
    • n = 3

    第二步(处理第二个操作 [4, 2]

    • m = Math.min(2, 4); -> m = 2(因为 2 仍然是当前 m 和 op[0] 的最小值)。
    • n = Math.min(3, 2); -> n = 2(因为 2 是当前 n 和 op[1] 的最小值)。

    此时

    • m = 2
    • n = 2

    第三步(处理第三个操作 [1, 5]

    • m = Math.min(2, 1); -> m = 1(因为 1 是当前 m 和 op[0] 的最小值)。
    • n = Math.min(2, 5); -> n = 2(因为 2 仍然是当前 n 和 op[1] 的最小值)。

    此时

    • m = 1
    • n = 2
  3. 遍历结束,返回结果

    • 执行 return m * n; -> return 1 * 2; -> return 2;


3.三个数最大乘积

题目:

给你一个整型数组 nums ,在数组中找出由三个数组成的最大乘积,并输出这个乘积。

示例 :

输入:nums = [1,2,3]
输出:6

解题思路:

如果数组中全是非负数,则排序后最大的三个数相乘即为最大乘积;如果全是非正数,则最大的三个数相乘同样也为最大乘积。

如果数组中有正数有负数,则最大乘积既可能是三个最大正数的乘积,也可能是两个最小负数(即绝对值最大)与最大正数的乘积。

代码(Java):

class Solution {
    public int maximumProduct(int[] nums) {
        Arrays.sort(nums);
        int n = nums.length;
        return Math.max(nums[0] * nums[1] * nums[n - 1], nums[n - 3] * nums[n - 2] * nums[n - 1]);
    }
}

 1. 数组中最小的两个数(nums[0]和nums[1])乘以最大的数(nums[n-1]), 这种情况适用于数组中有负数且负数的绝对值很大的情况,因为负数乘以负数会得到正数,可能使得乘积变得更大。  
 2. 数组中最大的三个数(nums[n-3]、nums[n-2]和nums[n-1])相乘。 这是最常见的情况,因为当数组中没有负数或者负数的绝对值不大时,直接取最大的三个数相乘即可得到最大乘积。


4.错误的集合

题目:

集合 s 包含从 1 到 n 的整数。不幸的是,因为数据错误,导致集合里面某一个数字复制了成了集合里面的另外一个数字的值,导致集合 丢失了一个数字 并且 有一个数字重复 。

给定一个数组 nums 代表了集合 S 发生错误后的结果。

请你找出重复出现的整数,再找到丢失的整数,将它们以数组的形式返回。

示例 :

输入:nums = [1,2,2,4]
输出:[2,3]

解题思路:

使用「哈希表」统计每个元素出现次数,然后在 [1,n] 查询每个元素的出现次数。

在「哈希表」中出现 2 次的为重复元素,未在「哈希表」中出现的元素为缺失元素。

由于这里数的范围确定为 [1,n],我们可以使用数组来充当「哈希表」,以减少「哈希表」的哈希函数执行和冲突扩容的时间开销。

代码(Java)

class Solution {
    public int[] findErrorNums(int[] nums) {
        int n = nums.length;
        int[] cnts = new int[n + 1];
        for (int x : nums) cnts[x]++;
        int[] ans = new int[2];
        for (int i = 1; i <= n; i++) {
            if (cnts[i] == 0) ans[1] = i;
            if (cnts[i] == 2) ans[0] = i;
        }
        return ans;
    }
}

int[] nums = {1, 2, 3, 3, 5};  
int[] cnts = new int[6]; // 长度为6,对应数字1到5  
  
// 遍历nums数组  
for (int x : nums) {  
    cnts[x]++; // 对应索引位置上的计数加1  
}  
  
// 遍历结束后,cnts数组的内容如下:  
// cnts[0] = 0(没有数字对应索引0)  
// cnts[1] = 1(数字1出现1次)  
// cnts[2] = 1(数字2出现1次)  
// cnts[3] = 2(数字3出现2次,即重复了)  
// cnts[4] = 0(数字4没有出现,即缺失了)  
// cnts[5] = 1(数字5出现1次)

❤️❤️❤️小郑是普通学生水平,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

轻触之间,静享尊贵 -- 家具缓冲器,优雅生活的守护者

在这个快节奏的时代&#xff0c;家是我们寻找宁静与舒适的空间。当您轻轻触摸门把手&#xff0c;缓缓关闭柜门&#xff0c;那一刻的宁静&#xff0c;不仅仅是一种感觉&#xff0c;它是家具缓冲器带给您的一份尊贵体验。家具缓冲器&#xff0c;就像一位无声的守护者&#xff0c;…

玩转微信公众号变现:从新手到专家的全攻略

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

C++ string(二)

目录 size()三种遍历string的方式auto迭代器capacity size() size:获取它有多少个字符 size_t size() const; int main() {string s1("hello world");size_t ret s1.size();//计算的是\0前面的字符个数cout << ret << endl;//11return 0; }三种遍历st…

【Redis】Centos 7 安装 Redis 5.0

目录 Redis重大版本 Redis 2.6 Redis 2.8 Redis 3.0 Redis 3.2 Redis 4.0 Redis 5.0 Redis 6.0 Redis 7.0 安装并启动Redis 安装scl源 安装Redis5.0 启动Redis 停止Redis Redis重大版本 Redis 借鉴了 Linux 操作系统对于版本号的命名规则&#xff1a;版本号第⼆…

C#裁剪图像的几种方法总结

前言 我们在上位机软件开发过程中经常需要裁剪图像&#xff0c;本文就是对c#中常见的裁剪图像方法进行总结。 1、克隆 直接调用Bitmap的Clone函数&#xff0c;然后指定需要裁剪的区域即可裁剪图像&#xff0c;该种方法不会损失精度 public static Bitmap CropImage_Clone(Bi…

[Bugku] web-CTF-网站被黑

1.开启环境 F12查看源代码 没有信息&#xff0c;扫描目录 扫描出shell.php 抓包尝试 使用密码字典爆破密码 得出flag

TypeScript 基础类型与类型声明

前言 在 JavaScript 中&#xff0c;变量是没有类型的&#xff0c;变量的值的类型是在运行时确定的&#xff0c;这被称为动态类型。 这意味着可以在不同的时间将不同类型的值赋给同一个变量&#xff0c;并且 JavaScript 会在运行时根据当前赋给变量的值来确定其类型。 示例&…

学生管理系统之界面设计

学生管理系统之界面设计 建立工程 新建登录界面

自动气象站:高度自动化、智能化和精准化

自动气象站&#xff0c;作为科技进步的产物&#xff0c;以其高度的自动化、智能化和精准化特点&#xff0c;极大地提升了气象观测的效率和准确性。它集成了多种高精度传感器&#xff0c;能够全天候、不间断地监测温度、湿度、气压、风速、风向、降水量等关键气象要素&#xff0…

RabbitMq架构原理剖析及应用

文章目录 RabbitMQ 架构组件1. **Broker** (Broker Server)2. **Exchange**3. **Queue**4. **Producer** (消息生产者)5. **Consumer** (消息消费者)6. **Virtual Hosts** (虚拟主机) 工作流程内部原理1. **队列管理**2. **集群**3. **持久化与内存**4. **性能优化** 高级特性1…

高德地图离线版 使用高德地图api的方法

高德离线包我已经存至Gitee&#xff08;自行下载即可&#xff09;&#xff1a;高德地图离线解决方案: 高德地图离线解决方案 然因为高德地图的瓦片地图太大&#xff0c;所以要让后端部署下 前端直接调用 如果本地 直接找到瓦片图路径就可以 initMap () {const base_url "…

基于 Kafka 的经验:AutoMQ 和 MinIO 如何解决成本和弹性挑战

Apache Kafka 因其出色的设计和强大的功能而成为流式处理的事实标准。它不仅定义了现代流式处理的架构&#xff0c;而且其独特的分布式日志抽象还为实时数据流处理和分析提供了前所未有的功能。Kafka 的成功在于它能够满足高吞吐量和低延迟的数据处理需求&#xff0c;多年来&am…

(2024|ICLR,∞-Diff,无限维平滑扩散,希尔伯特空间,超分辨率,多尺度架构)具有子采样平滑状态的无限分辨率扩散

∞-Diff: Infinite Resolution Diffusion with Subsampled Mollified States 目录 0. 摘要 1. 简介 2. 生成式神经场 3. 无限维扩散模型 3.1 平滑化&#xff08;Mollificaition&#xff09; 3.2 无限维度平滑扩散 4. 参数化扩散过程 4.1 神经算子 4.2 多尺度架构 4.3…

element-plus框架+vue3+echart——后台页面

一、图表样式 图表组件&#xff1a;echarts https://echarts.apache.org/examples/zh/index.html element-plus框架&#xff1a; https://www.cwgj.xyz/zh-CN/ 1、折线图 栅格 一共24。 12代表占一半50%&#xff0c; 当页面缩小到一定程度 占整个屏幕的100%。 id"mo…

【Axure教程】拖拉拽编辑页面

低代码开发平台通常提供拖拉拽编辑页面的功能&#xff0c;使用户无需编写大量代码即可创建复杂的应用程序和页面。这种平台的特点是通过图形用户界面来进行开发&#xff0c;用户可以拖拽组件到画布上进行布局和配置。 那今天作者就教大家在Axure里怎么制作拖拉拽动态编辑页面的…

01 LVS负载均衡群集

1.1 LVS群集应用基础 群集的称呼来自于英文单词“Cluster"&#xff0c;表示一群、一串的意思&#xff0c;用在服务器领域则表示大量服务器的集合体&#xff0c;以区分于单个服务器。 1.1.1 群集技术概述 LVS&#xff08;Linux Virtual Server&#xff09;是Linux虚拟服…

linux下的线程

概念理解 linux下没有线程的概念&#xff0c;只有轻量级进程的概念&#xff0c; 有接口&#xff1a;clone() 是clone&#xff08;&#xff09;调用&#xff0c;在库中创建栈 源码解析 int clone(int (*fn)(void *), void *child_stack,int flags, void *arg, .../* pid_t *p…

【Spring】详细了解静态代理和动态代理的使用

目录 1.代理模式介绍 2. 静态代理 3.动态代理 3.1 JDK动态代理 3.2 CGLIB动态代理 4. 动态代理和静态代理的区别 1.代理模式介绍 代理模式分为动态代理和静态代理&#xff0c;目的是在不直接暴露真实对象的情况下&#xff0c;通过代理对象来间接访问真实对象&#xff0c;从…

【设计模式】设计模式之观察者模式

文章目录 观察者模式什么是观察者模式引入组成UML图代码实现1. 定义观察者接口2. 定义主题接口3. 实现具体观察者4. 实现具体被观察者5.测试 应用场景优点缺点 观察者模式 什么是观察者模式 观察者模式&#xff08;Observer Pattern&#xff09;是一种设计模式 它定义了一种…

vLLMcuda安装笔记

1. 引言 最近在部署Qwen模型时&#xff0c;文档上有提到强烈建议用vLLM来部署模型&#xff0c;按照公开的性能测试数据&#xff0c;用vLLM部署Qwen模型的文本推理速度要比transformers部署快3~4倍。带着这个好奇就开始安装尝试&#xff0c;但试下来这个安装过程并没有那么顺利…