牛客题目——最长无重复子数组、分糖果问题、旋转数组

2023-11-15


题目1——最长无重复子数组

给定一个长度为n的数组arr,返回arr的最长无重复元素子数组的长度,无重复指的是所有数字都不相同,子数组是连续的。

示例
输入:[1,2,3,1,2,3,2,2]
输出:3(最长子数组为[1,2,3])

输入:[2,2,3,4,8,99,3]
输出:5(最长子数组为[2,3,4,8,99])

解题思路

使用两个指针i和j,i不断后移遍历数组,把扫描过的元素放入到map当中,如果当前元素不在map当中,表明元素未重复,就一直往后移,同时记录不重复元素子数组的长度Math.max(max_len,i-j+1);如果当前元素在map当中,则更新j的位置为Math.max(j,map.get(a[i])+1),因为遇到的重复数字可能在j之前,所以为了确保连续的子数组数字不重复,应该比较两个位置。

代码实现

import java.util.*;
public class Solution {
    public int maxLength (int[] arr) {
        if(arr.length == 0)
            return 0;
        if(arr.length == 1)
            return 1;
        int n = arr.length;
        int max_len = 0;
        Map<Integer,Integer> map = new HashMap<Integer,Integer>();
        //i后移遍历数组
        for(int i=0,j=0;i<arr.length;++i){
            //如果存在重复元素,则更新j的位置
            if(map.containsKey(arr[i])){
                j = Math.max(j,map.get(arr[i])+1);
            }
            //否则数字不重复,加入到map中
            map.put(arr[i],i);
            max_len = Math.max(max_len,i-j+1);  //更新最大长度
        }
        return max_len;
    }
}

题目2——分糖果问题

一群孩子做游戏,现在请你根据游戏得分来发糖果,要求如下:
1.每个孩子不管得分多少,起码分到一个糖果。
2.任意两个相邻孩子之间,得分较多的孩子必须拿多一些糖果。(若相同则无此限制)
给定一个数组arr代表得分数组,请返回最少需要多少糖果。
要求:时间复杂度为O(n),空间复杂度为O(n)

示例
输入:[1,1,2]
输出:4(最优分配方案为1,1,2)

解题思路

贪心算法总是做出在当前看来是最好的选择,它并不从整体上最优考虑,通过一系列局部最优的选择来达到问题的整体最优解。
该算法的过程:
从问题的某一初始解出发;
while 能朝给定总目标前进一步 do
求出可行解的一个解元素;
由所有解元素组合成问题的一个可行解;

要想糖果数少,如果相邻位置没有增加的情况,大家都分到1;如果相邻位置有增加的情况,将分到的糖果加1即可。具体做法如下:

  • 使用一个数组来记录每个孩子分到的糖果,并且全部初始化为1;
  • 从左到右遍历,如果右边元素比左边大arr[i]>arr[i-1],则糖果数加1,否则保持1不变;
  • 从右到左遍历,如果左边比相邻右边大arr[i]>arr[i+1],并且左边糖果数更小,则更新左边糖果数为右边糖果数+1,否则保持不变;
  • 糖果数组累加求和即可。

代码实现

import java.util.*;
public class Solution {
    public int candy (int[] arr) {
        int n = arr.length;
        if(n<=1)
            return n;
        int[] candy = new int[n];
        for(int i=0;i<n;i++)
            candy[i] = 1;
        //从左到右遍历,如果右边大于左边元素,则增加一个
        for(int i=1;i<n;i++){
            if(arr[i]>arr[i-1])
                candy[i] = candy[i-1]+1;
        }
        int res = candy[n-1];
        //最后一个元素的相邻元素只有左边,所以从倒数第二个元素开始遍历
        //从右到左遍历,如果左边大并且糖果数少
        for(int i=n-2;i>=0;i--){
            if(arr[i]>arr[i+1] && candy[i]<=candy[i+1])
                candy[i] = candy[i+1]+1;
            res += candy[i];
        }
        return res;
    }
}

题目3——旋转数组

一个数组A中存有n个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(M>=0)个位置,即将A中的数据由(A0 A1 ……AN-1 )变换为(AN-M …… AN-1 A0 A1 ……AN-M-1 ),最后M个数循环移至最前面的M个位置。如果需要考虑程序移动数据的次数尽量少,要如何设计移动方法?
要求:空间复杂度为O(1),时间复杂度为O(n)

示例
输入:6, 2, [1,2,3,4,5,6]
输出:[5,6,1,2,3,4]

解题思路

循环右移相当于从第m个位置开始,左右两部分整体反转,比如1234567右移3位得到5671234,1234为左半部分,567为右半部分。具体做法如下:

  • 因为m可能大于n,因此需要对n取余,长度为n的旋转数组相当于没有变化;
  • 第一次将整个数组翻转,得到数组的逆序;
  • 第二次将左边的m个元素翻转;
  • 第三次将右边的n-m个元素翻转。

代码实现

import java.util.*;
public class Solution {
    public void swap(int[] nums,int s,int e){
        int temp = nums[s];
        nums[s] = nums[e];
        nums[e] = temp;
    }
    public void reverse(int[] nums,int start,int end){
        while(start<end){
            swap(nums,start,end);
            start++;
            end--;
        }
    }
    public int[] solve (int n, int m, int[] a) {
        m = m%n;
        reverse(a,0,n-1);
        reverse(a,0,m-1);
        reverse(a,m,n-1);
        return a;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

牛客题目——最长无重复子数组、分糖果问题、旋转数组 的相关文章

随机推荐

  • C语言的一个正则表达式pcre

    1 简介 在C C 中 一个比较好的正则表达式是pcre 被很多工具 包括一些商用工具 使用 2 源码下载 安装 2 1 下载 可以从官网http www pcre org 下载 为方便学习 已放在这里http download csdn
  • ctf.show web入门(信息搜集) 1~20

    目录 web1 源码 web2 源码 web3 抓包 web4 robots web5 index phps web6 解压源码泄露 web7 git泄露 web8 svn泄露 web9 vim缓存 web10 cookie web11 域
  • 快速排序全部算法

    快速排序 cpp 定义控制台应用程序的入口点 include stdafx h include stdlib h include stdio h define MAXSIZE 10 typedef struct int keyWord in
  • 代码随想录算法训练营第13天

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 算法训练营第13天 栈与队列总结 347 前 K 个高频元素 使用堆 基本思路 堆 使用大顶堆还是小顶堆 python 中的heapq 347 前 K 个高频元素 这道题的代
  • 用户级线程和系统级线程

    在多线程操作系统中 各个系统的实现方式并不相同 在有的系统中实现了用户级线程 有的系统中实现了内核级线程 1 内核级线程 1 线程的创建 撤销和切换等 都需要内核直接实现 即内核了解每一个作为可调度实体的线程 2 这些线程可以在全系统内进行
  • 于仕琪C/C++ 学习笔记

    C 函数指针有哪几类 函数指针 lambda 仿函数对象分别是什么 如何利用谓词对给定容器进行自定义排序 传递引用和传递值的区别 传递常引用和传递引用之间的区别 传递右值引用和传递引用之 间的区别 函数对象应该通过什么传递 什么是万能引用
  • 【华为OD机试真题 JAVA】服务器广播

    JS版 华为OD机试真题 JS 服务器广播 标题 服务器广播 时间限制 1秒 内存限制 262144K 语言限制 不限 服务器连接方式包括直接相连 间接连接 A和B直接连接 B和C直接连接 则A和C间接连接 直接连接和间接连接都可以发送广播
  • Java 设计模式之责任链模式

    责任链模式 Chain of Responsibliity 缩写COR 该模式属于对象的行为模式 多个对象连成一条链 请求沿着这条链进行传递 直到有一个对象处理它为止 这样使得多个对象都有机会处理请求 从而避免了请求的发送者和接收者之间的耦
  • 性能测试及相关概念(一)

    目录 一 什么是性能测试 1 1 性能测试概念 1 2 功能测试和性能测试的区别 1 3 影响一个软件性能的因素有哪些 二 一个项目为什么要做性能测试 三 性能测试常见术语以及衡量指标 3 1 专业术语 四 性能测试分类 4 1 基准测试
  • 特征工程之特征选择

    特征工程是数据分析中最耗时间和精力的一部分工作 它不像算法和模型那样是确定的步骤 更多是工程上的经验和权衡 因此没有统一的方法 这里只是对一些常用的方法做一个总结 本文关注于特征选择部分 后面还有两篇会关注于特征表达和特征预处理 1 特征的
  • 单片机学习 6-矩阵按键实验

    矩阵按键实验 矩阵按键介绍 独立按键与单片机连接时 每一个按键都需要单片机的一个 I O 口 若某单片机系统需较多按键 如果用独立按键便会占用过多的 I O 口资源 单片机系统中 I O 口资源往往比较宝贵 当用到多个按键时为了减少 I O
  • vector<int> v 与 vector<int> v(n) 的区别

    使用vector的注意事项 切记 使用 vector
  • ESP32连接阿里云MQTT

    ESP32连接阿里云的github链接 ESP32官网文档 可下载开发文档 文章目录 一 ESP32介绍 二 搭建ESP32开发环境 一 调出终端 二 代码补全 三 ESP32接入阿里云 一 编译项目 二 配置项目 三 烧录程序 四 配置四
  • MLIR Multi-Level Intermediate Representation Overview (多级中间表示概述)

    多级中间表示概述 MLIR项目是一种构建可重用和可扩展的编译器基础结构的新颖方法 MLIR旨在解决软件碎片问题 改善异构硬件的编译 显着降低构建特定于域的编译器的成本 并有助于将现有的编译器连接在一起 要引用MLIR 请使用 此Arxiv出
  • Cause: java.lang.ClassNotFoundException: Cannot find class怎么解决

    java lang ClassNotFoundException Cannot find class 这个异常通常表示在你的 Java 程序中找不到某个类 这可能是由于以下几种情况造成的 类文件没有被编译 在运行 Java 程序时 需要先使
  • TensorFlow学习之LSTM ---语言模型(PTB数据集的处理)

    语言模型是很多自然语言处理应用的基石 非常多自然语言处理应用的技术都是基于语言模型 语言模型的任务就是预测每个句子在语言中出现的概率 一 评价方法 语言模型效果好坏的常用评价指标时复杂度 perplexity 在一个测试集上得到的perpl
  • Java泛型 自限定类型(Self-Bound Types)详解

    文章目录 简介 普通泛型类 构成自限定 自限定类型的泛型类 JDK源码里自限定的应用 enum JDK源码里自限定的应用 Integer 简介 java泛型里会有class SelfBounded
  • HTTP常见状态码(404、400、500)等错误

    访问网页偶尔会打不开 且有一串数字或带着中文或英文 这都是网页状态码在提示页面打不开的原因 常见的状态码有 200 服务器成功返回网页 404 请求的网页不存在 503 服务不可用 今天就为大家详细分解下有多少种状态码且各类状态码代表的意思
  • dbfread报错ValueError错误解决方法

    问题 我在用dbfread处理 dbf数据的时候出现了报错 ValueError could not convert string to float b 然后查找 dbf源文件的时候 发现在报错的那一行数据中 有一列甚至好几列的数据中出现了
  • 牛客题目——最长无重复子数组、分糖果问题、旋转数组

    文章目录 题目1 最长无重复子数组 解题思路 代码实现 题目2 分糖果问题 解题思路 代码实现 题目3 旋转数组 解题思路 代码实现 题目1 最长无重复子数组 给定一个长度为n的数组arr 返回arr的最长无重复元素子数组的长度 无重复指的