交换和--排序

2023-11-11

LeetCode

面试题 16.21.交换和

给定两个整数数组,请交换一对数值(每个数组中取一个数值),使得两个数组所有元素的和相等。

返回一个数组,第一个元素是第一个数组中要交换的元素,第二个元素是第二个数组中要交换的元素。若有多个答案,返回任意一个均可。若无满足条件的数值,返回空数组。

示例:

输入: array1 = [4, 1, 2, 1, 1, 2], array2 = [3, 6, 3, 3]
输出: [1, 3]

示例:

输入: array1 = [1, 2, 3], array2 = [4, 5, 6]
输出: []

提示:

  • 1 <= array1.length, array2.length <= 100000

解法:求和取差值

解题思路:

思路很简单,我们先求出两个数组的和num1num2,然后对两个数组遍历,求出两个元素的差值diff,如果diff*2 == num1-num2,那这两个元素就是我们要求的结果了

我的代码(超时)

class Solution {
    public int[] findSwapValues(int[] array1, int[] array2) {
        int num1 = 0;
        int num2 = 0;
        ArrayList<Integer> arr1 = new ArrayList<>();
        ArrayList<Integer> arr2 = new ArrayList<>();
        for(int i=0; i<array1.length; i++)
        {
            if(i>0)
            {
                if(array1[i]!=array1[i-1])
                    arr1.add(array1[i]);
            }     
            else
                arr1.add(array1[i]);
            num1+=array1[i];
        }
        for(int i=0; i<array2.length; i++)
        {
            if(i>0)
            {
                if(array2[i]!=array2[i-1])
                    arr2.add(array2[i]);
            }   
            else
                arr2.add(array2[i]);
            num2+=array2[i];
        }
        for(int x: arr1)
        {
            for(int y: arr2)
            {
                if(Math.abs(x-y)*2==Math.abs(num1-num2))
                {
                    int[] res = {x,y};
                    return res;
                }
            }
        }
        int[] res = new int[0];
        return res;
    }
}

改进代码:

class Solution {
    public int[] findSwapValues(int[] array1, int[] array2) {
        Arrays.sort(array1);
        Arrays.sort(array2);
        Set<Integer> set = new HashSet<>();
        int sum1=0,sum2=0;
        for(int i:array2) 
        {
            set.add(i);
            sum2+=i;
        }
        for(int i:array1) 
        {
            sum1+=i;
        }
        if((sum1-sum2)%2!=0) return new int[] {};
        int count = (sum1-sum2)/2;
        for(int i=0;i<array1.length;i++) 
        {
            if(set.contains(array1[i]-count)) 
            {
                return new int[] {array1[i],array1[i]-count};
            }
        }
        return new int[] {};
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

交换和--排序 的相关文章

随机推荐

  • vue预览tiff格式文件

    vue 预览tiff格式的文件 1 下载tiff js tiff js官网 npm 安装 npm i tiff js S yarn 安装 yarn add tiff js S 安装完成之后通过 img 标签使用即可 div fileInfo
  • 数据结构:手撕图解二叉树(含大量递归图解)

    文章目录 写在前面 二叉树的创建 二叉树的遍历 前序遍历 中序遍历 后序遍历 层序遍历 二叉树的销毁 二叉树节点个数 二叉树叶子节点的个数 二叉树查找值为x的节点 二叉树是否为完全二叉树 写在前面 二叉树的几乎所有实现都是依靠递归实现 递归
  • 51单片机:独立按键控制数码管计数

    按键动作的前沿和后沿会都有大约10ms的抖动 人在按下按键到松开至少需要50ms以上 待考证 此代码实现的功能为给按键计数 并给按键消抖 欢迎邮箱交流 bglei foxmail com 作者 CHNfisher include
  • JS压缩图片

    作者 wuwhs https segmentfault com a 1190000023486410 说明 js image compressor 是一个实现轻量级图片压缩的 javascript 库 压缩后仅有 5kb 在前端页面即可实现
  • 【数据挖掘】特征化分析(信息增益)

    目录 前言 数据预处理 导入库 读取样本数据 计算过程 计算每个属性的熵 计算给定的样本分类所需要的期望信息 计算所有属性的信息增益 结果可视化 信息增益较大的属性下的结果 信息增益较小的属性下的结果 写在后面 前言 这是一个数据挖掘选修课
  • ubuntu系统中新建文件的默认权限

    在ubuntu系统中 当我们使用touch 和 mkdir 新建文件和目录时 并没有指明要赋予它们的权限 在man的帮助手册中也没有找到相应选项 虽然后续我们可以使用chmod 修改文件的权限 但是清楚新建文件的默认权限的来源是十分有必要的
  • 根据采购订单IDN进行MIGO过账的BAPI逻辑

    客户需求 根据ALV上的采购订单IDN进行过账 如果有IDN 就根据IDN过账 如果没有 就根据采购订单过账 BAPI ITEM数据填充如下 DATA ls goodsmvt item TYPE bapi2017 gm item creat
  • 黑马程序员——多线程笔记

    a target blank href http www itheima com android培训 a a target blank href http www itheima com java培训 a 期待与您交流 多线程 一 概念 进
  • python数据分析-Pandas数据清洗

    数据的格式请参考前面Pandas常见操作中数据的格式 数据清洗 1 重复值的处理 重复值一般采取删除法来处理 但有些重复值不能删除 例如订单明细数据或交易明细数据等 data data duplicated 判断重复数据并取出 data d
  • 区块链技术体系,快捷学习路径?

    这两年 数字货币和区块链很火 年初写过一些区块链与比特币的文章 反响也很不错 不少网友催我继续写区块链 我在这个方向未曾深耕 也不敢造次 结合自己的经验 写写区块链涉及的技术体系 以及学习区块链的途径和方法 一 区块链技术体系 数据层 数据
  • JVM的内存区域

    JVM的内存区域 不知不觉都大三了 回头看看以前的Android开发过程 遇到的很多问题都需要深入到源码去解决 这也促使我不断地深入学习Java的相关知识 首先要学习的肯定是JVM 不过JVM的知识体系十分庞杂 JVM的内存区域的划分是学习
  • opencv——训练自己的小狗分类器

    opencv python图像识别 训练自己的分类器 opencv支持训练自己的分类器 闲话少说 训练步骤 准备样本图像数据 样本数据预处理 正反样本数据生成正反txt vec文件 训练 测试结果 注意以下几点 首先应该注意样本数据量 预处
  • 前端对接微信公众号网页开发流程,前期配置

    微信公众号网页开发 其实就是我们开发的h5网页需要放到微信浏览器环境中使用 但是需要对接公众号授权 授权之后可以获取到用户的个人信息 以及可以使用公众号提供的一些API 如 图片上传 图片预览 获取位置信息 微信扫一扫等功能 在没有对接正式
  • 分数蓝桥杯

    题目描述 本题为填空题 只需要算出结果后 在代码中使用输出语句将所填结果输出即可 1 1 1 2 1 4 1 8 每项是前一项的一半 如果一共有 2020 项 求这个和是多少 结果用分数表示出来 类似 当然 这只是加了前 22 项而已 分子
  • git克隆、git库管理(git权威指南笔记)

    对等工作区 1 git clone
  • 应急响应-Linux入侵排查

    0x00 前言 当企业发生黑客入侵 系统崩溃或其它影响业务正常运行的安全事件时 急需第一时间进行处理 使企业的网络信息系统在最短时间内恢复正常工作 进一步查找入侵来源 还原入侵事故过程 同时给出解决方案与防范措施 为企业挽回或减少经济损失
  • android 系统内置拍照功能

    启动系统内置拍照功能 Intent localIntent new Intent android media action IMAGE CAPTURE fileUri getOutputMediaFileUri MEDIA TYPE IMA
  • 5000并发的qps是多少_php高并发问题思路

    qps多少才算高并发 首先是无状态前端机器不足以承载请求流量 需要进行水平扩展 一般QPS是千级 然后是关系型数据库无法承载读取或写入峰值 需要数据库横向扩展或引入nosql 一般是千到万级 之后是单机nosql无法承载 需要nosql横向
  • 眼睛血管分割matlab版本

    matlab的代码仅供参考 实现过程基本按照python版本的眼睛血管分割来实现 其中 python版本眼睛血管分割详见 眼睛血管分割python版 clc clear all close all image imread D test D
  • 交换和--排序

    LeetCode 面试题 16 21 交换和 给定两个整数数组 请交换一对数值 每个数组中取一个数值 使得两个数组所有元素的和相等 返回一个数组 第一个元素是第一个数组中要交换的元素 第二个元素是第二个数组中要交换的元素 若有多个答案 返回