和的逆运算问题

问题描述

n 个整数两两相加可以得到 n(n - 1) / 2 个和。我们的目标是:根据这些和找出原来的 n 个整数。

按非降序排序返回这 n 个数,如果无解,输出 "Impossible"。

测试样例

样例1:

输入:n = 3, sums = [1269, 1160, 1663]
输出:"383 777 886"

样例2:

输入:n = 3, sums = [1, 1, 1]
输出:"Impossible"

样例3:

输入:n = 5, sums = [226, 223, 225, 224, 227, 229, 228, 226, 225, 227]
输出:"111 112 113 114 115"

样例4:

输入:n = 5, sums = [-1, 0, -1, -2, 1, 0, -1, 1, 0, -1]
输出:"-1 -1 0 0 1"

样例5:

输入:n = 5, sums = [79950, 79936, 79942, 79962, 79954, 79972, 79960, 79968, 79924, 79932]
输出:"39953 39971 39979 39983 39989"

 方法一:线性代数矩阵法

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;public class Main {public static String solution(int n, int[] sums) {//判断计算是否正确Map<Integer,Integer> map = new HashMap<>();for(int i = 0;i < sums.length;i++){map.merge(sums[i],1,(oV,nV)->oV+1);}//判断是否可以有整数解int sum = Arrays.stream(sums).sum();//看看所有未知数相加是否是整数if(sum % (n - 1) != 0) return "Impossible";int[] res = null;//排序sums和res,最大和的是最大的两个未知数的和,最小的是最小的两个未知数的和Arrays.sort(sums);//创建矩阵int[][] nums = new int[n][n+1];//解n个未知数的方程最小只需要n个不等式,这时我们已经找到了两个//赋值//赋值从最小的开始赋值,由于以a为基数,所以保证赋值是从小到大的int left = 1;//右指针控制哪个值不需要int right = left + n - 2;int midLeft = right - 1;int midRight = right - 1;while (res == null){//每次操作时进行初始化numsinitNums(nums,n,sums);int index = 1;if(midLeft == midRight){//中间没有一个需要去除的时候for(int i = left;i < right;i++){nums[index++][n] = sums[i];}}else {//中间有需要去除的for(int i = left;i < midLeft;i++){nums[index++][n] = sums[i];}for(int i = midRight;i < right;i++){nums[index++][n] = sums[i];}}//进行计算看看能否解出方程res = JFC(nums);//判断计算是否正确Map<Integer,Integer> temp = new HashMap<>();int resLeft = 0;int resRight = 1;if(res != null){while (resLeft < res.length-1){temp.merge(res[resLeft]+res[resRight],1,(oV,nV)->oV+1);resRight++;if(resRight == res.length){resLeft++;resRight = resLeft + 1;}}for(Map.Entry<Integer,Integer> entry : temp.entrySet()){if(entry.getValue() != map.get(entry.getKey())){res = null;break;}}}right++;midRight++;//该次循环结束if(right == sums.length){midLeft--;midRight = midLeft;right = left + n - 2;}//最头那个元素被排除if(midLeft == left){left++;right = left + n - 2;midLeft = right - 1;midRight = right - 1;}}Arrays.sort(res);StringBuffer sb = new StringBuffer();for(int i = 0;i < res.length;i++){sb.append(res[i]).append(" ");}return sb.substring(0,sb.length()-1);}private static void initNums(int[][] nums, int n, int[] sums) {for(int i = 0;i < n;i++){Arrays.fill(nums[i],0);}//1.最小值nums[0][0] = 1;nums[0][1] = 1;nums[0][n] = sums[0];//2.最大值nums[n-1][n-1] = 1;nums[n-1][n-2] = 1;nums[n-1][n] = sums[sums.length-1];//3.以a为基数,找到剩下n-2个不等式for(int i = 1;i < n-1;i++){nums[i][0] = 1;nums[i][i+1] = 1;}}private static int[] JFC(int[][] nums) {//解方程的函数int length = nums.length;//将矩阵准备好for(int i = 0;i < length;i++){int curr = nums[i][i];for(int j = i + 1;j < length;j++){int temp = nums[j][i];//temp为0时不用整理,直接跳过if(temp != 0) {if(Math.abs(temp) > Math.abs(curr)){//当绝对值temp大于curr时if(Math.abs(temp) % Math.abs(curr) != 0){return null;}else{//计算temp大于curr的倍数int BS = temp / curr;for(int k = 0;k <= length;k++){nums[j][k] -= nums[i][k] * BS;}}}else{//当curr大于temp时int BS;if(temp < 0 && curr < 0){BS = curr / temp;}else{BS = temp / curr;}for(int k = 0;k <= length;k++){if(Math.abs(nums[i][k]) % Math.abs(BS) != 0){return null;}else{nums[j][k] -= nums[i][k] / BS;}}}}}}//开始解开方程int[] res = new int[length];if(Math.abs(nums[length-1][length]) < Math.abs(nums[length-1][length-1]) || Math.abs(nums[length-1][length]) % Math.abs(nums[length-1][length-1]) != 0){return null;}else{res[0] = nums[length-1][length] / nums[length-1][length-1];}for(int i = 1;i < length-1;i++){res[i] = res[i-1] - nums[length - 1 - i][length];}res[length-1] = nums[0][length] - res[length-2];return res;}public static void main(String[] args) {// You can add more test cases hereint[] sums1 = {1269, 1160, 1663};int[] sums2 = {1, 1, 1};int[] sums3 = {226, 223, 225, 224, 227, 229, 228, 226, 225, 227};int[] sums4 = {-1, 0, -1, -2, 1, 0, -1, 1, 0, -1};int[] sums5 = {79950, 79936, 79942, 79962, 79954, 79972, 79960, 79968, 79924, 79932};System.out.println(solution(3, sums1).equals("383 777 886"));System.out.println(solution(3, sums2).equals("Impossible"));System.out.println(solution(5, sums3).equals("111 112 113 114 115"));System.out.println(solution(5, sums4).equals("-1 -1 0 0 1"));System.out.println(solution(5, sums5).equals("39953 39971 39979 39983 39989"));}
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CPU Study - Instructions Fetch

参考来源&#xff1a;《超标量处理器设计》—— 姚永斌 N-Way CPU 取指问题 如果CPU可以在每个周期内同时解码N条指令&#xff0c;则此类CPU为N-Way超标量处理器。 N-Way超标量处理器需要每个周期从I-Cache中至少取得N条指令&#xff0c;这N条指令成为一组Fetch Group。 为了…

掌握 PyQt5:从零开始的桌面应用开发

PyQT5——图形化界面 文章目录 PyQT5——图形化界面集成化图形界面工具为什么使用 \$ProjectFileDir$?示例场景其他 Varaiablespyuic参数解释整体含义示例使用PyQt5和pyuic 创建pyqt5的程序创建一个窗口app.exec\_()和sys.exit(app.exec_())的区别1. app.exec_()2. sys.exit(a…

论文阅读笔记:Image Processing GNN: Breaking Rigidity in Super-Resolution

论文阅读笔记&#xff1a;Image Processing GNN: Breaking Rigidity in Super-Resolution 1 背景2 创新点3 方法4 模块4.1 以往SR模型的刚性4.2 图构建4.2.1 度灵活性4.2.2 像素节点灵活性4.2.3 空间灵活性 4.3 图聚合4.4 多尺度图聚合模块MGB4.5 图聚合层GAL 5 效果5.1 和SOTA…

PMP–一、二、三模、冲刺–分类–7.成本管理–技巧–挣值分析

文章目录 技巧一模7.成本管理--4.控制成本--数据分析--挣值分析--进度绩效指数&#xff08;SPI&#xff09;是测量进度效率的一种指标&#xff0c;表示为挣值与计划价值之比&#xff0c;反映了项目团队完成工作的效率。 当 SPI小于 1.0 时&#xff0c;说明已完成的工作量未达到…

保姆级教程!!教你通过【Pycharm远程】连接服务器运行项目代码

小罗碎碎念 这篇文章主要解决一个问题——我有服务器&#xff0c;但是不知道怎么拿来写代码&#xff0c;跑深度学习项目。确实&#xff0c;玩深度学习的成本比较高&#xff0c;无论是前期的学习成本&#xff0c;还是你需要具备的硬件成本&#xff0c;都是拦路虎。小罗没有办法…

成绩管理系统软件体系结构设计

成绩管理系统软件体系结构设计 文档简介 1.1 目的 1.2 范围 1.3 定义、首字母缩写词和缩略语 1.4参考资料 1.5 概述体系结构表示方式软件体系结构的目标和约束 3.1 结构清晰 3.2 支持外包开发 3.3 可扩展性 3.4 系统安全性 3.5 可移植性 4体系结构模式逻辑视图进程视图…

单臂路由实现不同VLAN之间设备通信

转载请注明出处 本实验为单臂路由配置&#xff0c;目的为让不同VLAN之间的设备能够互相通信。 1.首先&#xff0c;按照要求配置两个pc的ip地址&#xff0c;以pc0为例子&#xff1a; 2在交换机创建vlan10和vlan20 3.划分vlan&#xff0c;pc0为vlan10的设备&#xff0c;pc1为vla…

机器学习(三)——决策树(附核心思想、重要算法、概念(信息熵、基尼指数、剪枝处理)及Python源码)

目录 关于1 基本流程2 划分属性的选择2.1 方法一&#xff1a;依据信息增益选择2.2 方法二&#xff1a;依据增益率选择2.3 方法三&#xff1a;依据基尼指数选择 3 剪枝处理&#xff1a;防止过拟合3.1 预剪枝3.2 后剪枝 4 连续与缺失值4.1 连续值处理4.2 缺失值处理 5 多变量决策…

Ubuntu和Debian系列的Release默认shell解释器变更

Debian 12 Bookworm 和 Ubuntu 24.04 中默认的 shell 解释器已经由 bash 变更为了 dash 。 这个变化对于我们直接在 CLI 上执行 Linux command 无影响&#xff0c;但对于执行shell解释性程序有影响&#xff0c;已知 bash 中的 变量正规表达式 &#xff08;如 ${GIT_COMMIT:0:8…

ReLU6替换ReLU为什么可以增强硬件效率?

ReLU6&#xff08;Rectified Linear Unit 6&#xff09;是ReLU的一种变体&#xff0c;它在ReLU的基础上增加了一个上限值6&#xff0c;即输出范围被限制在[0, 6]之间。 这种变化在硬件实现中可以带来以下几个方面的效率提升&#xff1a; 1. 数据表示的简化 ReLU的输出范围是[…

vscode在windows和linux如何使用cmake构建项目并make生成可执行文件,两者有什么区别

vscode在windows和linux如何使用cmake构建项目并make生成可执行文件&#xff0c;两者有什么区别 windows默认使用的是最新的visual studio&#xff0c;而linux默认就是cmake 文章目录 vscode在windows和linux如何使用cmake构建项目并make生成可执行文件&#xff0c;两者有什么…

Spirngboot集成Knife4j spirngboot版本2.7.17 Knife4j版本4.0.0

Knife4j是什么&#xff1f;有什么作用&#xff1f; ‌Knife4j‌是一个基于Swagger的Java RESTful API文档工具&#xff0c;旨在帮助开发者轻松生成和维护API文档。它继承并增强了Swagger的功能&#xff0c;简化了使用流程&#xff0c;并提供了一系列增强功能&#xff0c;如接口…

ROS2humble版本使用colcon构建包

colcon与与catkin相比&#xff0c;没有 devel 目录。 创建工作空间 首先&#xff0c;创建一个目录 ( ros2_example_ws ) 来包含我们的工作区: mkdir -p ~/ros2_example_ws/src cd ~/ros2_example_ws 此时&#xff0c;工作区包含一个空目录 src : . └── src1 directory, …

GY-56 (VL53L0X) 激光测距

文章目录 一、GY-56 简介二、引脚功能三、通信协议1.串口协议&#xff1a; 当 GY-56 PS 焊点开放时候使用(默认)&#xff08;1&#xff09;串口通信参数&#xff08;默认波特率值 9600bps&#xff09;&#xff08;2&#xff09;模块输出格式&#xff0c;每帧包含 8-13 个字节&a…

C语言 | Leetcode C语言题解之第541题反转字符串II

题目&#xff1a; 题解&#xff1a; void swap(char* a, char* b) {char tmp *a;*a *b, *b tmp; }void reverse(char* l, char* r) {while (l < r) {swap(l, --r);} }int min(int a, int b) {return a < b ? a : b; }char* reverseStr(char* s, int k) {int n strl…

提升网站安全性 HTTPS的重要性与应用指南

内容概要 在如今数字化快速发展的时代&#xff0c;网站安全显得尤为重要。许多用户在访问网站时&#xff0c;尤其是涉及个人信息或金融交易时&#xff0c;对数据传输的安全性有着高度的关注。HTTPS&#xff08;超文本传输安全协议&#xff09;正是为了满足这种需求而诞生的。通…

Transformer究竟是什么?预训练又指什么?BERT

目录 Transformer究竟是什么? 预训练又指什么? BERT的影响力 Transformer究竟是什么? Transformer是一种基于自注意力机制(Self-Attention Mechanism)的神经网络架构,它最初是为解决机器翻译等序列到序列(Seq2Seq)任务而设计的。与传统的循环神经网络(RNN)或卷…

OpenDroneMap Webodm

OpenDroneMap & Webodm OpenDroneMap Webodm 开源无人机航拍系列图像及其它系列图像三维重建软件。很棒的开源无人机测绘软件OpenDroneMap,从航拍图像生成精确的地图、高程模型、3D 模型和点云。 应用领域 Mapping & Surveying 测绘和测量 从图像测量获得高精度的可…

Java+Swing可视化图像处理软件

JavaSwing可视化图像处理软件 一、系统介绍二、功能展示1.图片裁剪2.图片缩放3.图片旋转4.图像灰度处理5.图像变形6.图像扭曲7.图像移动 三、系统实现1.ImageProcessing.java 四、其它1.其他系统实现2.获取源码 一、系统介绍 该系统实现了图片裁剪、缩放、旋转、图像灰度处理、…

迈入国际舞台,AORO M8防爆手机获国际IECEx、欧盟ATEX防爆认证

近日&#xff0c;深圳市遨游通讯设备有限公司&#xff08;以下简称“遨游通讯”&#xff09;旗下5G防爆手机——AORO M8&#xff0c;通过了CSA集团的严格测试和评估&#xff0c;荣获国际IECEx及欧盟ATEX防爆认证证书。2024年11月5日&#xff0c;CSA集团和遨游通讯双方领导在遨游…