一个非升序排列的数组A,如果将一个非负整数b插入到A中 ,要求插入以后数组A仍按非升序排列,则数值严格小于b的元素的排名会发生变化。请你编写程序计算依次插入m个非负整数到A中,排名发生变化的总次数。
时间: 2024-11-11 07:30:15 浏览: 4
这是一个经典的算法题目,通常可以使用二分查找和哈希集合来解决。以下是基本的步骤:
1. **初始化**:创建一个哈希集合(HashSet)来存储数组A中的元素及其索引,同时初始化一个计数器count来记录排名变化次数。
2. **遍历插入**:对于每个需要插入的整数b,从集合中查找是否已经存在,如果存在,说明排名不会改变,跳过;如果不存在,执行以下操作:
- 首先检查b应插入的位置:即二分查找法,在已排序的数组A中找到第一个大于等于b的元素的位置。
- 如果找到了,那么在这个位置之前的所有元素都比b小,它们的排名会被后面的元素超过,所以count加一。
- 插入b到A,并将它的索引添加到集合中。
3. **更新哈希集合**:每次插入结束后,都要更新哈希集合,移除已经被替换掉的旧元素(即原索引处的元素)。
4. **返回结果**:最后返回count,即排名发生变化的总次数。
```python
def countRankChanges(A, m):
if not A:
return 0
index_map = {v: i for i, v in enumerate(A)}
count = 0
for _ in range(m):
b = ... # 得到下一个待插入的整数
if b in index_map:
continue
left, right = 0, len(A) - 1
while left < right:
mid = (left + right) // 2
if A[mid] >= b:
right = mid
else:
left = mid + 1
A.insert(left, b)
del index_map[A[left]]
rank_changes = [index_map.get(v, None) for v in A]
count += sum(1 for prev in rank_changes[:-1] if prev is not None and prev > left)
return count
```
阅读全文