3. 有一个整数顺序表工。设计一个尽可能高效的算法删除其中所有值为负整数的元素(假设工中值为负整数的元素可能有多个),删除后元素的相对次序不改变。并给出算法的时间和空间复杂度。使用Java编写
时间: 2024-09-20 22:10:54 浏览: 47
为了高效地删除整数列表 `nums` 中所有值为负数的元素,你可以采用“双指针”策略,同时遍历列表,只保留非负数。这种做法不需要额外的空间存储,时间复杂度主要取决于列表的实际长度以及负数的数量。
算法步骤如下:
1. 定义两个指针 `left` 和 `right`,初始时都指向列表的第一个元素。
2. 当 `left` 指向的元素是非负数时,将其移动到新的位置(即 `right++`)。
3. 如果 `left` 指向的是负数,不做处理,直接 `left++`,继续检查下一个元素。
4. 当 `left` 越过所有负数后,将 `nums` 切片从 `right` 开始,直到列表结束,得到的就是去除了负数的新列表。
以下是这个算法的 Java 实现:
```java
public class Solution {
public void removeNegativeNumbers(int[] nums) {
int left = 0;
for (int right = 0; right < nums.length; right++) {
if (nums[right] >= 0) {
nums[left++] = nums[right]; // 移动非负数到新位置
}
}
// 简化数组大小
nums = Arrays.copyOfRange(nums, left, nums.length);
}
}
```
时间复杂度:O(n),n 是列表 `nums` 的长度。因为每个元素只会被访问一次。
空间复杂度:O(1),因为我们只是在原数组上移动元素,没有使用额外的空间。
阅读全文