查询删除和添加元素后的数组
难度:
标签:
题目描述
代码结果
运行时间: 142 ms, 内存: 44.5 MB
/*
* LeetCode 2113: Queries on an Array After Removing and Adding Elements
*
* 思路:
* 1. 使用 Java Stream 来处理每个查询。
* 2. 'remove' 查询会从数组中删除指定的元素。
* 3. 'add' 查询会在数组末尾添加指定的元素。
* 4. 'get' 查询会返回当前数组中的元素列表。
*/
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
public class Solution {
public List<Integer> processQueries(List<List<String>> queries) {
List<Integer> array = new ArrayList<>();
List<Integer> result = queries.stream()
.flatMap(query -> {
String command = query.get(0);
if (command.equals("add")) {
int value = Integer.parseInt(query.get(1));
array.add(value);
} else if (command.equals("remove")) {
int value = Integer.parseInt(query.get(1));
array.remove(Integer.valueOf(value));
} else if (command.equals("get")) {
return array.stream();
}
return array.stream();
})
.collect(Collectors.toList());
return result;
}
}
解释
方法:
这道题目的核心是模拟数组在一系列操作后的状态。这里的操作包括添加和删除元素,但是具体的添加和删除规则并没有明确说明。基于题解代码,我们可以推测操作是周期性的,周期长度为2m(m是数组初始长度)。在前m个时间单位,数组长度递减,之后的m个时间单位,数组长度递增。查询操作是确定在特定时间点给定索引位置的元素。如果索引有效,则返回该位置的元素;如果无效(索引超出当前数组长度),则返回-1。\n\n1. 对于每个查询,计算时间点和索引。\n2. 使用time % (2 * m)确保处理的时间在合法范围内(即0到2m-1)。\n3. 计算当前时间的数组长度。\n4. 判断索引是否在当前数组长度内。如果在,计算并确定该索引在原始数组中的位置;如果不在,返回-1。
时间复杂度:
O(n)
空间复杂度:
O(1)
代码细节讲解
🦆
在此算法中,如何确保每次计算的`lengthAtTime`正确反映了删除或添加操作后数组的实际长度?
▷🦆
为什么在计算`time`时使用`time % (2 * m)`,这样的周期性处理对算法的正确性有什么关键作用?
▷🦆
如果数组的操作规则不是简单的周期增减,算法需要做哪些调整来适应更复杂的操作规则?
▷🦆
在处理查询结果时,算法如何处理数组长度在减少到0之后再次增加的情况?
▷