排序题目:通过翻转子数组使两个数组相等

news2026/4/17 10:12:52

文章目录

  • 题目
    • 标题和出处
    • 难度
    • 题目描述
      • 要求
      • 示例
      • 数据范围
  • 前言
  • 解法一
    • 思路和算法
    • 代码
    • 复杂度分析
  • 解法二
    • 思路和算法
    • 代码
    • 复杂度分析

题目

标题和出处

标题:通过翻转子数组使两个数组相等

出处:1460. 通过翻转子数组使两个数组相等

难度

3 级

题目描述

要求

给定两个长度相同的整数数组 target \texttt{target} target arr \texttt{arr} arr。每一步中,可以选择 arr \texttt{arr} arr 的任意非空子数组并将它翻转。可以执行此过程任意次。

如果能让 arr \texttt{arr} arr 变成与 target \texttt{target} target 相同,返回 true \texttt{true} true;否则,返回 false \texttt{false} false

示例

示例 1:

输入: target   =   [1,2,3,4],   arr   =   [2,4,1,3] \texttt{target = [1,2,3,4], arr = [2,4,1,3]} target = [1,2,3,4], arr = [2,4,1,3]
输出: true \texttt{true} true
解释:可以按照如下步骤使 arr \texttt{arr} arr 变成 target \texttt{target} target
1- 翻转子数组 [2,4,1] \texttt{[2,4,1]} [2,4,1] arr \texttt{arr} arr 变成 [1,4,2,3] \texttt{[1,4,2,3]} [1,4,2,3]
2- 翻转子数组 [4,2] \texttt{[4,2]} [4,2] arr \texttt{arr} arr 变成 [1,2,4,3] \texttt{[1,2,4,3]} [1,2,4,3]
3- 翻转子数组 [4,3] \texttt{[4,3]} [4,3] arr \texttt{arr} arr 变成 [1,2,3,4] \texttt{[1,2,3,4]} [1,2,3,4]
上述方法并不是唯一的,还存在多种将 arr \texttt{arr} arr 变成 target \texttt{target} target 的方法。

示例 2:

输入: target   =   [7],   arr   =   [7] \texttt{target = [7], arr = [7]} target = [7], arr = [7]
输出: true \texttt{true} true
解释: arr \texttt{arr} arr 不需要做任何翻转已经与 target \texttt{target} target 相等。

示例 3:

输入: target   =   [3,7,9],   arr   =   [3,7,11] \texttt{target = [3,7,9], arr = [3,7,11]} target = [3,7,9], arr = [3,7,11]
输出: false \texttt{false} false
解释: arr \texttt{arr} arr 没有数字 9 \texttt{9} 9,所以无法变成 target \texttt{target} target

数据范围

  • target.length = arr.length \texttt{target.length} = \texttt{arr.length} target.length=arr.length
  • 1 ≤ target.length ≤ 1000 \texttt{1} \le \texttt{target.length} \le \texttt{1000} 1target.length1000
  • 1 ≤ target[i] ≤ 1000 \texttt{1} \le \texttt{target[i]} \le \texttt{1000} 1target[i]1000
  • 1 ≤ arr[i] ≤ 1000 \texttt{1} \le \texttt{arr[i]} \le \texttt{1000} 1arr[i]1000

前言

如果数组 target \textit{target} target arr \textit{arr} arr 的元素不完全相同,则 target \textit{target} target 中至少有一个元素是 arr \textit{arr} arr 中没有的,因此不可能通过翻转 arr \textit{arr} arr 的子数组将 arr \textit{arr} arr 变成与 target \textit{target} target 相同。

如果数组 target \textit{target} target arr \textit{arr} arr 的元素完全相同,则 target \textit{target} target 中的每一个元素都在 arr \textit{arr} arr 中有一个对应的元素。对于 i ≥ 0 i \ge 0 i0,第 i i i 次翻转子数组时,找到下标 j j j 使得 i ≤ j i \le j ij target [ i ] = arr [ j ] \textit{target}[i] = \textit{arr}[j] target[i]=arr[j](如果有多个符合要求的下标 j j j,则任选其中一个下标),将 arr \textit{arr} arr 的下标范围 [ i , j ] [i, j] [i,j] 的子数组翻转,翻转之后有 target [ i ] = arr [ i ] \textit{target}[i] = \textit{arr}[i] target[i]=arr[i]。因此可以通过翻转使得两个数组中所有下标处的元素都对应相等,即可以通过翻转 arr \textit{arr} arr 的子数组将 arr \textit{arr} arr 变成与 target \textit{target} target 相同。

根据上述分析可知,判断是否可以通过翻转 arr \textit{arr} arr 的子数组将 arr \textit{arr} arr 变成与 target \textit{target} target 相同,实质是判断 target \textit{target} target arr \textit{arr} arr 的元素是否相同。因此这道题和「有效的字母异位词」相似。

解法一

思路和算法

可以通过排序的方式判断两个数组的元素是否相同。对数组 target \textit{target} target arr \textit{arr} arr 分别排序,并比较排序之后的两个数组是否相同。

  • 如果排序之后的两个数组相同,则两个数组的元素相同,可以通过翻转 arr \textit{arr} arr 的子数组将 arr \textit{arr} arr 变成与 target \textit{target} target 相同。

  • 如果排序之后的两个数组不同,则两个数组的元素不同,不能通过翻转 arr \textit{arr} arr 的子数组将 arr \textit{arr} arr 变成与 target \textit{target} target 相同。

代码

class Solution {
    public boolean canBeEqual(int[] target, int[] arr) {
        Arrays.sort(target);
        Arrays.sort(arr);
        return Arrays.equals(target, arr);
    }
}

复杂度分析

  • 时间复杂度: O ( n log ⁡ n ) O(n \log n) O(nlogn),其中 n n n 是数组 target \textit{target} target arr \textit{arr} arr 的长度。需要 O ( n log ⁡ n ) O(n \log n) O(nlogn) 的时间对两个数组排序,排序后需要 O ( n ) O(n) O(n) 的时间比较两个数组是否相同,因此时间复杂度是 O ( n log ⁡ n ) O(n \log n) O(nlogn)

  • 空间复杂度: O ( log ⁡ n ) O(\log n) O(logn),其中 n n n 是数组 target \textit{target} target arr \textit{arr} arr 的长度。排序需要 O ( log ⁡ n ) O(\log n) O(logn) 的递归调用栈空间。

解法二

思路和算法

为了判断两个数组的元素是否相同,可以分别统计两个数组中每个元素的出现次数。只有当任意元素在两个数组中的出现次数相同时,两个数组的元素才相同。

使用哈希表存储每个元素的计数。首先遍历 target \textit{target} target,对于每个元素,将其在哈希表中对应的计数加 1 1 1。然后遍历 arr \textit{arr} arr,对于每个元素,将其在哈希表中对应的计数减 1 1 1。如果遍历 target \textit{target} target arr \textit{arr} arr 之后,哈希表中的每个计数都是 0 0 0,则 target \textit{target} target arr \textit{arr} arr 的元素相同。

实现方面,可以有以下两点优化。

  1. 由于在遍历 arr \textit{arr} arr 的过程中,哈希表中的计数只会减少,因此当哈希表中的计数出现负数时,该计数对应的元素在 arr \textit{arr} arr 中的出现次数大于在 target \textit{target} target 中的出现次数,此时两个数组的元素不同。

  2. 如果在遍历 arr \textit{arr} arr 的过程中,哈希表中的计数都没有出现负数,则遍历结束之后可以确定两个数组的元素相同,不需要再次遍历哈希表检查是否每个计数都是 0 0 0。理由如下。

    1. 遍历 arr \textit{arr} arr 的过程中,哈希表中的计数都没有出现负数,说明任何元素在 arr \textit{arr} arr 中的出现次数不超过在 target \textit{target} target 中的出现次数。

    2. 假设存在一个元素,该元素在 arr \textit{arr} arr 中的出现次数小于在 target \textit{target} target 中的出现次数,则 arr \textit{arr} arr 的长度小于 target \textit{target} target 的长度,与 arr \textit{arr} arr 的长度等于 target \textit{target} target 的长度矛盾。因此任何元素在 arr \textit{arr} arr 中的出现次数都等于在 target \textit{target} target 中的出现次数。

如果两个数组的元素相同,则可以通过翻转 arr \textit{arr} arr 的子数组将 arr \textit{arr} arr 变成与 target \textit{target} target 相同,否则不能通过翻转 arr \textit{arr} arr 的子数组将 arr \textit{arr} arr 变成与 target \textit{target} target 相同。

代码

class Solution {
    public boolean canBeEqual(int[] target, int[] arr) {
        Map<Integer, Integer> counts = new HashMap<Integer, Integer>();
        int length = target.length;
        for (int i = 0; i < length; i++) {
            int num = target[i];
            counts.put(num, counts.getOrDefault(num, 0) + 1);
        }
        for (int i = 0; i < length; i++) {
            int num = arr[i];
            counts.put(num, counts.getOrDefault(num, 0) - 1);
            if (counts.get(num) < 0) {
                return false;
            }
        }
        return true;
    }
}

复杂度分析

  • 时间复杂度: O ( n ) O(n) O(n),其中 n n n 是数组 target \textit{target} target arr \textit{arr} arr 的长度。需要遍历 target \textit{target} target arr \textit{arr} arr 各一次并维护计数,每次遍历都需要 O ( n ) O(n) O(n) 的时间。

  • 空间复杂度: O ( n ) O(n) O(n),其中 n n n 是数组 target \textit{target} target arr \textit{arr} arr 的长度。需要使用哈希表记录每个元素的计数,空间为 O ( n ) O(n) O(n)

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

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

相关文章

Mysql高价语句

一.高级语法的查询语句 1.排序语法&#xff08;默认的排序方式就是升序&#xff09;。 升序ASC&#xff1a;select * from test01 order by name; 降序DESC&#xff1a;select * from test01 order by name desc; 多个列排序&#xff1a;以多个列作为排序&#xff0c;只有第一…

分布式服务框架zookeeper+消息队列kafka

一、zookeeper概述 zookeeper是一个分布式服务框架&#xff0c;它主要是用来解决分布式应用中经常遇到的一些数据管理问题&#xff0c;如&#xff1a;命名服务&#xff0c;状态同步&#xff0c;配置中心&#xff0c;集群管理等。 在分布式环境下&#xff0c;经常需要对应用/服…

【Python】爬虫实战02:电影市场票房情况分析与可视化

1. 前言 在信息爆炸的时代&#xff0c;数据分析已成为各行各业的重要工具。特别是在电影行业&#xff0c;票房数据不仅反映了电影的市场表现&#xff0c;也是电影产业健康发展的关键指标。为了更好地理解和分析中国大陆电影市场的票房情况&#xff0c;本代码提供了一个自动化数…

【Linux/Windows】Wireshark抓包工具下载、安装、使用、数据分析、常用知识点

文章目录 Linux版下载Windows版下载Wireshark使用Wireshark测试Tcp三次握手Wireshark常见过滤条件本篇小结 更多相关内容可查看 在一个阳光明媚的周五清晨&#xff0c;一起快乐的玩耍一下Wireshark Linux版下载 1.使用yum安装wireshark yum -y install wireshark2.使用yum安…

全网最简单的Mysql 8.3 安装及环境配置教程

Windows系统计算机环境配置 第一篇关于环境配置的文档之MySQL 8.3&#xff08;msi版本和zip版本略有不同&#xff0c;本文档介绍msi版本&#xff0c;若zip版本有需求&#xff0c;请在评论区留言&#xff0c;我后续会出相关文档。&#xff09; 前言 网上的MySQL配置教程非常多…

杰发科技AC7840——SENT数据解析及软件Sent发送的实现

0. 测试环境 AC7840官方Demo板&#xff1b; 图莫斯0503 DSlogic U2Basic 使用引脚 输出脚&#xff1a;PB1 时钟&#xff1a;PB2&#xff0c;其他引脚可以不初始化&#xff0c;不接线 1. 数据解析 以下是SENT数据的格式&#xff08;1tick以3us为例&#xff09;&#…

智能优化算法之灰狼优化算法(GWO)

智能优化算法是一类基于自然界中生物、物理或社会现象的优化技术。这些算法通过模拟自然界中的一些智能行为&#xff0c;如遗传学、蚁群觅食、粒子群体运动等&#xff0c;来解决复杂的优化问题。智能优化算法广泛应用于各种工程和科学领域&#xff0c;因其具有全局搜索能力、鲁…

Android Display Graphics #User APP的绘制与WMS

如果图片链接失败&#xff0c;请扫码查看文章详情。 Android Display Graphics系列文章-汇总 系列文章请扫关注公众号&#xff01; 1、User APP的绘制 用户APP在调用ViewRootImpl#setView()方法时&#xff0c;首次请求VSync信号。之后进入loop循环&#xff0c;等待显示事件。…

【数据结构】:链表实现洗牌功能

此操作包含的基本功能有&#xff1a; 组牌&#xff1a;组建 52 张扑克牌 四种花色&#xff1a;“♥️”&#xff0c;“♠️”&#xff0c;“⬛️”&#xff0c;“♣️”每种花色 13 张牌&#xff1a;1~13 洗牌&#xff1a;将 52 张扑克牌打乱顺序发牌&#xff1a;给三个人每人发…

关于光伏电站监控数据

电站监控后台显示的发电量数据不能真实的反应不同逆变器方案的发电量差异。组串式逆变器由于交流线缆长&#xff0c;损耗的电量比集中式方案高1-2%左右。在通过监控后台显示的发电量衡量不同逆变器的差异时&#xff0c;需要减掉这部分差值。 光伏电站监控后台统计的发电量是从光…

桌面小宠物发布一周,第一次以独立开发者的身份赚到了100块

收入数据(AppStore一周收入统计) AppStore付费工具榜第七 应用简介 桌面新宠(NewPet)&#xff0c;是我耗时半年开发的一款桌面宠物。我是被 QQ 宠物影响的那批人&#xff0c;上学时天天给 QQ 宠物喂食&#xff0c;很可惜它现在不在了。所以&#xff0c;我开发的初衷是想要在电…

图像分类算法概述:深度学习方法

图像分类算法概述&#xff1a;深度学习方法 图像分类是计算机视觉中的一个基本任务&#xff0c;近年来随着深度学习的发展&#xff0c;图像分类算法取得了巨大的进步。本文将概述主要的深度学习图像分类算法。 #mermaid-svg-fkTtkPLl9ahuVT6w {font-family:"trebuchet ms…

Linux(CentOS7)部署PHP-7.2.17源码包

PHP-7.2.17源码包部署 安装php1. 解压并进入php-7.2.17文件夹2. 编写php.sh脚本3. 执行php.sh 配置Apache与PHP1. 编写httpd.conf配置文件2. 编写php测试脚本 部署HTTPD-2.4.37源码包点击跳转 部署MySQL-5.6.31源码点击跳转 下载源码包和依赖的源码包&#xff0c;资源见文章顶…

TiDB实践—索引加速+分布式执行框架创建索引提升70+倍

作者&#xff1a; 数据源的TiDB学习之路 原文来源&#xff1a; https://tidb.net/blog/92d348c2 背景介绍 TiDB 采用在线异步变更的方式执行 DDL 语句&#xff0c;从而实现 DDL 语句的执行不会阻塞其他会话中的 DML 语句。按照是否需要操作 DDL 目标对象所包括的数据来划分…

linux学习week4+5

linux学习 十四.shell编程 9.单分支多分支 基本语法&#xff1a; if [ 条件 ] then代码 elif [ 条件 ] then代码 fi10.case语句 基本语法&#xff1a; case $变量名 in "值1") 程序1&#xff08;如果变量的值等于值1&#xff0c;则执行程序1&#xff09; ;; &q…

LeetCode刷题记录(第三天)55. 跳跃游戏

题目&#xff1a; 55. 跳跃游戏 标签&#xff1a;贪心 数组 动态规划 题目信息&#xff1a; 思路一&#xff1a;动态规划 确定dp数组含义&#xff1a; dp[i] 第[i]个位置能否达到确定递推公式&#xff1a; dp[i] 能不能达到&#xff0c;取决于前面d[i-j]&#xff0c;d[i-j…

Linux TFTP服务搭建及使用

1、TFTP 服务器介绍 TFTP &#xff08; Trivial File Transfer Protocol &#xff09;即简单文件传输协议是 TCP/IP 协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议&#xff0c;提供不复杂、开销不大的文件传输服务。端口号为 69 2、TFTP 文件传输的特点 tftp…

【博主推荐】HTML5实现简洁的实用的个人网站、个人主页七个页面源码

文章目录 1.设计来源1.1 个人主页界面1.2 关于我界面1.3 我的技能界面1.4 我的经验界面1.5 我的教育界面1.6 我的项目界面1.7 联系我界面 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板&#xff0c;程序开发&#xff0c;在线开发&#xff0c;在线沟通 作者&#xff1a;…

【MQTT(2)】开发一个客户端,ubuntu版本

基本流程如下&#xff0c;先生成Mosquitto的库&#xff0c;然后qt调用库进行开发界面。 文章目录 0 生成库1 有界面的QT版本2 无界面版本 0 生成库 下载源码&#xff1a;https://github.com/eclipse/mosquitto.git 编译ubuntu 版本很简单&#xff0c;安装官方说明直接make&am…

1分钟带你了解等保测评流程

常言道&#xff1a;“安全无小事&#xff0c;防患于未然。” 在信息化高速发展的今天&#xff0c;网络安全已成为国家安全的重要组成部分&#xff0c;等级保护&#xff08;简称“等保”&#xff09;测评作为网络安全防护的重要手段&#xff0c;对于确保信息系统安全、稳定运行…