牛客网NC276110题解:小红的数组重排

牛客网NC276110题解:小红的数组重排

题目解析

算法思路

  1. 对数组进行排序(非降序)
  2. 检查特殊情况:
    • 如果存在三个连续相等的元素,则无解
    • 如果前两个元素都是0,则无解
  3. 若不存在特殊情况,则排序后的数组即为所求

为什么这样做是正确的?

当我们对数组排序后,相邻元素的乘积往往会递增。但有两种特殊情况需要排除:

  1. 三个连续相等的数:假设有三个连续相等的数x,那么会出现x×x = x×x,不满足严格递增
  2. 开头两个0:如果前两个元素都是0,则a₁×a₂ = 0,而后续任何包含0的乘积也为0,无法形成严格递增序列

代码实现

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n;cin>>n;
    int k[n];
    for(int i=0;i<n;i++){
        cin>>k[i];
    }
    sort(k,k+n);//数组从小到大排列。
    for(int i=0;i<n-2;i++){
        if(k[i]==k[i+1]&&k[i+1]==k[i+2])
        {
            cout<<"NO";
            return 0;
        }
    }
        if(k[0]==k[1]&&k[0]==0)
        {
            cout<<"NO";
            return 0;
        }
    cout<<"YES"<<endl;
    for(int i=0;i<n;i++){cout<<k[i]<<" ";}
    return 0;
}

复杂度分析

  • 时间复杂度:O(nlogn),主要来自排序操作
  • 空间复杂度:O(n),存储输入数组

示例分析

以示例1为例:[7, 2, 5, 1]

  1. 排序后:[1, 2, 5, 7]
  2. 检查特殊情况:
    • 无三个连续相等的数
    • 开头两个数不都是0
  3. 输出排序后的数组:1 2 5 7

验证:1×2 < 2×5 < 5×7,即 2 < 10 < 35 ✓

注意题目示例输出了1 5 2 7,这也是正确答案的一种,因为:1×5 < 5×2 < 2×7,即 5 < 10 < 14 ✓

总结

这道题的关键是发现排序后的数组通常能满足要求,只需排除特殊情况。解题思路简洁明了,实现也很高效。

相关推荐
SKYDROID云卓小助手18 分钟前
无人设备遥控器之多设备协同技术篇
网络·人工智能·嵌入式硬件·算法·信号处理
熬了夜的程序员42 分钟前
【华为机试】34. 在排序数组中查找元素的第一个和最后一个位置
数据结构·算法·华为od·华为·面试·golang
phltxy1 小时前
ArrayList与顺序表
java·算法
草莓熊Lotso2 小时前
【数据结构初阶】--排序(一):直接插入排序,希尔排序
c语言·数据结构·经验分享·其他·排序算法
小拇指~2 小时前
梯度下降的基本原理
人工智能·算法·计算机视觉
小徐不徐说2 小时前
C++ 模板与 STL 基础入门:从泛型编程到实战工具集
开发语言·数据结构·c++·qt·面试
艾莉丝努力练剑2 小时前
【C/C++】类和对象(上):(一)类和结构体,命名规范——两大规范,新的作用域——类域
java·c语言·开发语言·c++·学习·算法
TDengine (老段)3 小时前
TDengine 中 TDgp 中添加机器学习模型
大数据·数据库·算法·机器学习·数据分析·时序数据库·tdengine
Tisfy4 小时前
LeetCode 2411.按位或最大的最小子数组长度:一次倒序遍历
数据结构·算法·leetcode·题解·位运算·遍历