leetcode
leetcode 1901 ~ 1950
按符号重排数组

按符号重排数组

难度:

标签:

题目描述

代码结果

运行时间: 87 ms, 内存: 39.6 MB


/*
题目思路:
1. 使用Java Stream流的方式分离正整数和负整数。
2. 然后交替从正整数和负整数流中取元素。
*/

import java.util.Arrays;

public class Solution {
    public int[] rearrangeArray(int[] nums) {
        // 分离正数和负数
        int[] positives = Arrays.stream(nums).filter(n -> n > 0).toArray();
        int[] negatives = Arrays.stream(nums).filter(n -> n < 0).toArray();
        
        int[] result = new int[nums.length];
        int posIndex = 0, negIndex = 0;
        
        // 交替添加正数和负数
        for (int i = 0; i < nums.length; i++) {
            result[i] = (i % 2 == 0) ? positives[posIndex++] : negatives[negIndex++];
        }
        
        return result;
    }
}

解释

方法:

此题解首先通过遍历给定的数组 `nums`,将所有正整数和负整数分别存储在两个列表 `l1` 和 `l2` 中。遍历一次完成后,已经成功地将正负数分开,并且保持了它们在原数组中的顺序。接下来,利用 Python 列表的切片操作,将 `nums` 数组的偶数位置填充为 `l1` 中的元素,奇数位置填充为 `l2` 中的元素。这样操作的结果是,数组中的正负数交替出现,且以正数开头,符合题目要求。最后返回修改后的 `nums` 数组。

时间复杂度:

O(n)

空间复杂度:

O(n)

代码细节讲解

🦆
为什么题解中选择以正数开头而不是负数开头进行数组重排?
选择以正数开头而不是负数开头进行数组重排通常是基于题目的具体要求。如果题目没有特别指定起始符号,通常会默认以正数开头,因为这可能是更常见的场景或更符合题目出题者的预期。在实际应用中,这种选择可能也更符合常规的数据处理习惯。
🦆
在代码实现中,如果输入的数组已经是正负交替且以正数开头,这种方法是否会引起不必要的计算和数组重排?
是的,即使输入的数组已经是正负交替且以正数开头,当前的算法实现仍然会执行分离正负数和重新填充数组的步骤,这会导致不必要的计算和内存使用。优化方法可以包括首先检查数组是否已满足条件,如果是,则直接返回原数组,从而减少不必要的操作。
🦆
题解中提到使用两个列表来分别存储正数和负数,这种方法是否会在处理大数据量时影响性能?
使用两个列表来分别存储正数和负数确实会增加内存使用,特别是在处理大数据量时。此外,这种方法还涉及多次遍历数据:一次用于分离正负数,另一次用于重组数组。这可能会导致较高的时间复杂度和空间复杂度,尤其是在数据量大时。可以考虑使用原地算法(in-place algorithm)来减少空间复杂度,例如通过双指针技术直接在原数组上操作,避免使用额外的存储空间。
🦆
如何保证数组重排后的结果确实满足所有题目的要求,特别是连续两个整数符号相反的条件?
题解通过确保偶数索引位置填充正数,奇数索引位置填充负数的方式来保证重排后的数组满足正负交替出现的条件。由于数组从零开始编号,通过这种方式可以确信偶数索引的正数后面紧跟的是奇数索引的负数,反之亦然。这种方法有效地利用了数组的索引特性,保证了每对相邻的整数符号相反。

相关问题