秋招突击——8/15——新作{最大子数组和、合并区间、转轮数组、除自身以外的数组的乘积}

news2024/11/16 6:40:12

文章目录

    • 引言
    • 新作
      • 最大子数组和
        • 个人实现
        • 参考实现
      • 合并区间
        • 个人实现
          • 短板补充——自定义排序标准
        • 参考实现
      • 转轮数组
        • 最终实现
      • 除自身以外数组的乘积
        • 个人实现
    • 总结

引言

  • 以前刷题的方式方法有问题,花太多时间了,应该先过一遍,然后再针对特定的题目好好刷,现在是广度上不来,还是有所欠缺的,以后的刷题方式改为:
    • 五分钟没思路,直接看题解,然后看完题解在写代码,还是写不出来,去看代码!

新作

最大子数组和

  • 今天做腾讯的面试,遇到了这道题,我不会做,然后直接使用暴力搜索做的,然后其他方法没有想到!

  • 题目链接

在这里插入图片描述
注意事项

  • 元素的个数是10的五次方
  • 元素可能为负数
  • 时间复杂度是O(n)
  • 进一步可以尝试使用分治去解决
个人实现
  • 这里想的是能不能保存一下,到达i是,前n项中,最小的序列,然后再遍历一下不同的序列!
  • 难受,这里想起来了,使用动态规划,实现,一下子调出来了,可惜了了!
class Solution {
    public int maxSubArray(int[] nums) {
        int len = nums.length;
        int[] minSeq = new int[nums.length];
        int[] sumValue = new int[nums.length];
        sumValue[0] = nums[0];
        
        // 这里是计算对应前n项和
        minSeq[0] = Math.min(nums[0],0);
        for(int i = 1;i < len;i ++){
            sumValue[i] = nums[i] + sumValue[ i -1];
            minSeq[i] = Math.min(minSeq[i - 1],sumValue[i]);
        }
        System.out.println(Arrays.toString(minSeq));

        // 再次遍历计算最值
        int res = nums[0];
        for(int i = 0;i < len;i ++){
            if(i >= 1)
                res = Math.max(sumValue[i] - minSeq[i - 1],res);
        }

        return res;
    }
}

在这里插入图片描述

参考实现
  • 这里本质上是采用了区间DP,同时使用滚动数组进行优化,先说一下动态数组表示的数据。

    • f[i]表示以节点i为结尾的所有序列的最大值
    • 最终的状态应该是这样,按照序列的长度的进行划分
      • 序列的长度为1,仅仅包含节点i
      • 序列的长度大于等于二,但是都包含对应f[i - 1]个元素,所以应该是f[i - 1] + nums[i]
    • 最终应该选择最大值所以f[i] = Math.max(nums[i],f[i - 1] + nums[i]);
  • 然后使用滚动数组进行优化,从前往后进行遍历,i从零变成n

    • 然后就是last = Math.max(nums[i],last + nums[i])
  • 最后每一次在比较一下最大值的

class Solution {
    public int maxSubArray(int[] nums) {
        if(nums.length == 1)    return nums[0];
        int res = Integer.MIN_VALUE,last = 0;
        for(int i = 0;i < nums.length;i ++){
            last = Math.max(nums[i],last + nums[i]);
            res = Math.max(last,res);
        }
        return res;
    }
}

合并区间

  • 题目连接

在这里插入图片描述

个人实现
  • 这道题单纯使用的方法是模拟,先按照区间的起点进行排序,然后逐个元素进行比较,进行合并区间,这个时候主要关注的是第二个区间大小关系!
class Solution {
    public int[][] merge(int[][] nums) {
        List<int[]> list = new ArrayList<>();
        List<int[]> numsList = new ArrayList<>(); 
        for(int[] row : nums)   numsList.add(row);
        numsList.sort(Comparator.comparingInt(a -> a[0]));

        // 定义左右边界
        int l = numsList.get(0)[0],r = numsList.get(0)[1];
        for(int i = 1;i < nums.length;i ++){
            if(numsList.get(i)[0] <= r && numsList.get(i)[0] >= l)  r = Math.max(r,numsList.get(i)[1]);
            else{
                list.add(new int[]{l,r});
                l = numsList.get(i)[0];
                r = numsList.get(i)[1];
            }
        }
        list.add(new int[]{l,r});
        int[][] res = new int[list.size()][2];
        for(int i = 0;i <list.size();i ++){
            res[i][0] = list.get(i)[0];
            res[i][1] = list.get(i)[1];
        }
        return res;
    }
}

在完成这个题目的过程中,遇到了一些问题,不知道关于二维数组的排序怎么实现,如何自定义对于一个对象的排序功能。

短板补充——自定义排序标准

Arrays.sort是不支持二维数组排序的,只能对基本数据类型进行排序,这里要将之保存为对应的集合进行保存!

  • Collections.sort进行排序
    • Comparator指定排序地元素
    • 指定两个元素,并使用lambda表达式进行实现
import java.util.*;

class Main{
    public static void main(String args[]){
        List<int[]> list = new ArrayList<>();
        int[][] nums = {{1,2,3},{4,5,6},{6,7,8},{4,9,0}};
        for(int[] x:nums){
            list.add(x);
        }
        
        // 排序方式1
        Collections.sort(list, Comparator.comparingInt(p -> p[0]));
        for(int[] x:list)
            System.out.println(Arrays.toString(x));
        // 排序方式2
        Collections.sort(list, (p1,p2)->Integer.compare(p2[0] , p1[0]));
        for(int[] x:list)
            System.out.println(Arrays.toString(x));
    }
}

在这里插入图片描述
使用Arrays.sort重构进行排序

  • 新创建一个Comparator兑现
Arrays.sort(intervals,new Comparator<int[]>(){
	public int compare(int[] interval1,int[] interval2){
		return interval1[0] - interval2[0];
	}
});
参考实现

参考代码的思路基本上跟我是一致的,但是写的比我的简洁,他是直接和数组中最后一个元素进行比较的,我每次都是单独和l或者r进行比较,然后费了精力!

class Solution {
    public int[][] merge(int[][] nums) {
        if(nums.length == 0)    return new int[0][2];
        Arrays.sort(nums,new Comparator<int[]>(){
            public int compare(int[] interval1,int[] interval2){
                return interval1[0] - interval2[0];
            }
        });

        List<int[]> list = new ArrayList<>();
        for(int[] x:nums){
            int l = x[0];
            int r = x[1];
            if(list.size() == 0 || list.get(list.size() - 1)[1] < l){
                list.add(new int[]{l,r});
            }else{
                list.get(list.size() - 1)[1] = Math.max(list.get(list.size() - 1)[1],r);
            }
        }
    }
    
    return list.toArray(new int[list.size()][]);
   
}

转轮数组

  • 题目链接
    在这里插入图片描述
    注意
  • 数组的长度是10的五次方
  • 数组元素可以使用int进行存储,但是一旦进行运算,会超过界限
  • 时间复杂度是O(1)
最终实现

这里创建了一个新的数组进行复制,然后这道题应该就是索引的变化,马上要面试了,有点紧张,就不推导了!

class Solution {
    public void rotate(int[] nums, int k) {
        int n = nums.length;
        int[] newArr = new int[n];
        for(int i = 0;i < n;i ++){
            newArr[(i + k) % n] = nums[i];
        }
        System.arraycopy(newArr, 0, nums, 0, n);
    }
}

在这里插入图片描述

除自身以外数组的乘积

题目连接

在这里插入图片描述
注意

  • 时间复杂度是O(n)解决即可!
个人实现
  • 这个题目完全是模拟,时间复杂度是限定在O(n),所以不能出现嵌套循环,串行两个循环,计算对应的前缀和和后缀和即可!
class Solution {
    public int[] productExceptSelf(int[] nums) {
        int m = nums.length;
        int[] preVal = new int[m];
        int[] nextVal = new int[m];
        for(int i = 0;i < m;i ++)   {
            if(i < 1)   preVal[i] = nums[i];
            else preVal[i] = preVal[i - 1] * nums[i];
        }
        //System.out.println(Arrays.toString(preVal));

        for(int i = m - 1;i >= 0 ;i--){
            if(i == m - 1)  nextVal[i] = nums[i];
            else nextVal[i] = nextVal[i + 1] * nums[i];
        }
        //System.out.println(Arrays.toString(nextVal));


        int[] res = new int[m];
        for(int i = 0;i < m;i ++){
            int pre = 1;
            if(i > 0)   pre = preVal[i - 1];
            int next = 1;
            if(i < m - 1) next = nextVal[i + 1];
            res[i] = pre * next;
        }
        return res;

    }
}

在这里插入图片描述

总结

  • 拖得有点久了,差不多两三天才做完,数组这章,感觉没啥挑战!比较适合模拟!

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

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

相关文章

第一百九十四节 Java集合教程 - Java优先级队列

Java集合教程 - Java优先级队列 优先级队列是其中每个元素具有相关联的优先级的队列。具有最高优先级的元素将从队列中删除。 PriorityQueue 是一个实现类对于Java Collection Framework中的无界优先级队列。 我们可以使用在每个元素中实现的 Comparable 接口作为其优先事项。…

C# OnnxRuntime YoloV5 Demo

目录 效果 模型信息 项目 代码 Form1.cs YoloV5.cs 下载 效果 模型信息 Model Properties ------------------------- --------------------------------------------------------------- Inputs ------------------------- name&#xff1a;images tensor&#xff1a…

机器学习/人工智能中的学习证明

一、说明 在进行任何数学发展之前&#xff0c;我们必须首先了解学习的基础以及它如何与错误的概念密切相关。关于代价函数&#xff0c;它的工作原理是梯度下降原理。本文将回顾梯度下降原理。 二、假想的厨师 想象一下&#xff0c;在任何一天&#xff0c;你决定复制你在一家著名…

8.13 Day19 Windows服务器(Windows service 2008 R2)上域的搭建 (1)

域服务器&#xff08;DC&#xff09;&#xff1a;安装了活动目录服务的服务器就称为DC。 将三台设备配置在同一网络中&#xff0c;此处将外部网络隔离开&#xff0c;只将他们放在局域网中 服务端网络配置&#xff0c;此时与外部网络彻底隔绝开&#xff0c;且已无法和主机通信&…

XSS game复现(DOM型)

目录 1.Ma Spaghet! 2.Jefff 3.Ugandan Knuckles 4.Ricardo Milos 5.Ah Thats Hawt 6.Ligma 7.Mafia 8.Ok, Boomer 1.Ma Spaghet! 通过简单的尝试发现传递参数可以直接进入h2标签 接下来我们尝试传入一个alert(1) 可以看到并没有触发。原因是在innerHTML中官方禁用了sc…

二进制安装php

下载php二进制包&#xff1a; 官网地址&#xff1a;https://www.php.net/releases/ PHP: Releaseshttps://www.php.net/releases/在里边可以选择自己要下载的包进行下载&#xff1b; 下载完成后进行解压&#xff1a; tar xvzf php-7.3.12.tar.gz 解压后 进入目录进行预编…

xss案例

首先进入XSS Game - Learning XSS Made Simple! | Created by PwnFunction打开环境 Ma Spaghet 在script里面给使用get传参给somdbody传一个值&#xff0c;若没有传值&#xff0c;默认传SomebodyToucha Ma Spaghet!,赋值给spaghet,放在h2标签中&#xff0c;spaghet后会有一个in…

Linux根目录下的各个目录的用途介绍

在Linux系统中&#xff0c;我们可以通过cd /命令进入根目录&#xff0c;然后ls -l(或者ll命令)即可查看根下目前的目录情况&#xff1a; 这些不同目录的用途说明如下&#xff1a; /bin&#xff1a;包含基本命令文件&#xff0c;如ls、cp等&#xff0c;这个文件中的文件都是可执…

基于协同过滤算法的黔醉酒业白酒销售系统_p091v--论文

TOC springboot349基于协同过滤算法的黔醉酒业白酒销售系统_p091v--论文 绪论 1.1背景及意义 中国经济快速发展&#xff0c;人均GDP逐年上涨&#xff0c;非生活必须品的消费比重也随之增加 &#xff0c;酒类销售额度&#xff0c;尤其是酱香型白酒销售额近些年可谓发展迅猛&…

STM32通过I2C硬件读写MPU6050

目录 STM32通过I2C硬件读写MPU6050 1. STM32的I2C外设简介 2. STM32的I2C基本框图 3. STIM32硬件I2C主机发送流程 10位地址与7位地址的区别 7位主机发送的时序流程 7位主机接收的时序流程 4. STM32硬件与软件的波形对比 5. STM32配置硬件I2C外设流程 6. STM32的I2C.h…

Hadoop如何搭建计算和存储节点分离

在业内存在着一种看起来比较离谱的搭建方式&#xff0c;叫计算节点与存储节点分离&#xff0c;说它比较离谱&#xff0c;是因为hadoop架构本身不直接支持将这两者分开&#xff0c;因为hadoop本身的一大优势就是计算本地化&#xff0c;这种分开搭建的方式抛弃了这种优势&#xf…

Linux 软件编程学习第十五天

1.TCP粘包问题&#xff1a; TCP发送数据是连续的&#xff0c;两次发送的数据可能粘连成一包被接收到 1.解决粘包问题方法&#xff1a; 1.接收指定长度&#xff1a;&#xff08;不稳定&#xff09; 发送5个字节 接收5个字节 2.睡眠&#x…

用户画像实时标签数据处理流程图

背景 在用户画像中&#xff0c;有一类实时标签&#xff0c;我们既要它能够实时的对外提供数据统计&#xff0c;也要保存到大数据组件中用于后续的对数&#xff0c;圈选的逻辑&#xff0c;本文就看一下用户画像的实时标签的数据流转图 实时标签数据流转图 首先我们肯定是要使…

GoMail发送邮件的性能优化策略有哪些方法?

GoMail发送邮件如何配置服务器&#xff1f;GoMail发信功能如何&#xff1f; GoMail是一款广受欢迎的Go语言邮件发送库&#xff0c;具备高效、易用等优点&#xff0c;但在高并发场景下&#xff0c;GoMail发送邮件的性能优化显得尤为重要。AokSend将探讨几种有效的GoMail发送邮件…

图像数据处理14

三、空域滤波 3.3 统计排序滤波器 统计排序滤波器属于非线性空域滤波器&#xff0c;常见的统计排序滤波器有中值滤波器、最大值滤波器、最小值滤波器。 中值滤波器、最大值滤波器和最小值滤波器是三种常见的统计排序滤波器&#xff0c;它们在图像处理和信号处理中发挥着重要…

WUP-MY-LABEL-PRINTER 旻佑热敏打印机标签打印uniapp插件使用说明

插件地址&#xff1a;WUP-MY-LABEL-PRINTER 旻佑热敏打印机标签打印安卓库 简介 本插件主要用于旻佑热敏打印机打印标签&#xff0c;不支持票据打印。适用于旻佑的各型支持标签打印的热敏打印机。本插件开发时使用的打印机型号为MY-805嵌入式面板打印机&#xff0c;其他型号请…

Cisco交换机SSH使用RSA公钥免密登录(IOS与Nexus,服务器以RHEL8为例)

目录 需求实验步骤0. 实验环境1. Linux2. CiscoIOS基础设置保存密钥登陆测试 3. CiscoNexus基础配置保存密钥登陆测试 需求 在实际工作中&#xff0c;常会遇到自动化的需求&#xff0c;那么在自动采集、配置等对网络设备的自动化需求中&#xff0c;不可避免的会遇到需要登录-&…

tensorboard显示一片空白解决方案

OK艾瑞巴蒂 不知道看这个视频几个小土堆过来的&#xff0c;今天已经发了一篇博文探讨快速下载tensorboard了 下面用的时候叒出现问题了 from torch.utils.tensorboard import SummaryWriter writer SummaryWriter("logs")# writer.add_image() # Yx for i in range…

实时手势识别(1)- 基于手部检测+手部分类

目录 前言 1.实现效果 2.非端到端实现的原因 3.分类网络与数据准备 4.训练结果 5.测试结果 6.训练代码 7.训练日志 7.1ResNet18训练日志 7.2ShuffleNet_v2训练日志 前言 利用YOLOv8获取手部区域&#xff0c;然后对手部区域进行分类&#xff0c;实现手势识别。 本文使…

powershell 终端 执行 pnpm -v报错

1.问题描述&#xff1a; 明明全局已安装 pnpm &#xff0c;但在vscode默认终端 powershell 执行 pnpm -v 却报错&#xff1a; 2.问题根因&#xff1a; 原因是 PowerShell 执行策略问题。 3.解决方案&#xff1a; 以管理员身份运行 PowerShell 查看 PowerShell 的执行策略…