feat: add solutions to lc problem: No.2163 (#4574)

No.2163.Minimum Difference in Sums After Removal of Elements
This commit is contained in:
Libin YANG 2025-07-18 07:18:20 +08:00 committed by GitHub
parent cf8049ed75
commit 5a94bc4374
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 175 additions and 24 deletions

View File

@ -206,14 +206,14 @@ func (h *hp) Pop() any {
```ts
function minRefuelStops(target: number, startFuel: number, stations: number[][]): number {
const pq = new MaxPriorityQueue();
const pq = new MaxPriorityQueue<number>();
let [ans, pre] = [0, 0];
stations.push([target, 0]);
for (const [pos, fuel] of stations) {
const dist = pos - pre;
startFuel -= dist;
while (startFuel < 0 && !pq.isEmpty()) {
startFuel += pq.dequeue().element;
startFuel += pq.dequeue();
ans++;
}
if (startFuel < 0) {

View File

@ -203,14 +203,14 @@ func (h *hp) Pop() any {
```ts
function minRefuelStops(target: number, startFuel: number, stations: number[][]): number {
const pq = new MaxPriorityQueue();
const pq = new MaxPriorityQueue<number>();
let [ans, pre] = [0, 0];
stations.push([target, 0]);
for (const [pos, fuel] of stations) {
const dist = pos - pre;
startFuel -= dist;
while (startFuel < 0 && !pq.isEmpty()) {
startFuel += pq.dequeue().element;
startFuel += pq.dequeue();
ans++;
}
if (startFuel < 0) {

View File

@ -1,12 +1,12 @@
function minRefuelStops(target: number, startFuel: number, stations: number[][]): number {
const pq = new MaxPriorityQueue();
const pq = new MaxPriorityQueue<number>();
let [ans, pre] = [0, 0];
stations.push([target, 0]);
for (const [pos, fuel] of stations) {
const dist = pos - pre;
startFuel -= dist;
while (startFuel < 0 && !pq.isEmpty()) {
startFuel += pq.dequeue().element;
startFuel += pq.dequeue();
ans++;
}
if (startFuel < 0) {

View File

@ -264,25 +264,25 @@ function minimumDifference(nums: number[]): number {
const n = Math.floor(m / 3);
let s = 0;
const pre: number[] = Array(m + 1);
const q1 = new MaxPriorityQueue();
const q1 = new MaxPriorityQueue<number>();
for (let i = 1; i <= n * 2; ++i) {
const x = nums[i - 1];
s += x;
q1.enqueue(x, x);
q1.enqueue(x);
if (q1.size() > n) {
s -= q1.dequeue().element;
s -= q1.dequeue();
}
pre[i] = s;
}
s = 0;
const suf: number[] = Array(m + 1);
const q2 = new MinPriorityQueue();
const q2 = new MinPriorityQueue<number>();
for (let i = m; i > n; --i) {
const x = nums[i - 1];
s += x;
q2.enqueue(x, x);
q2.enqueue(x);
if (q2.size() > n) {
s -= q2.dequeue().element;
s -= q2.dequeue();
}
suf[i] = s;
}
@ -294,6 +294,58 @@ function minimumDifference(nums: number[]): number {
}
```
#### Rust
```rust
use std::collections::BinaryHeap;
use std::cmp::Reverse;
impl Solution {
pub fn minimum_difference(nums: Vec<i32>) -> i64 {
let m = nums.len();
let n = m / 3;
let mut s = 0i64;
let mut pre = vec![0i64; m + 1];
let mut pq = BinaryHeap::new(); // max-heap
for i in 1..=2 * n {
let x = nums[i - 1] as i64;
s += x;
pq.push(x);
if pq.len() > n {
if let Some(top) = pq.pop() {
s -= top;
}
}
pre[i] = s;
}
s = 0;
let mut suf = vec![0i64; m + 1];
let mut pq = BinaryHeap::new();
for i in (n + 1..=m).rev() {
let x = nums[i - 1] as i64;
s += x;
pq.push(Reverse(x));
if pq.len() > n {
if let Some(Reverse(top)) = pq.pop() {
s -= top;
}
}
suf[i] = s;
}
let mut ans = i64::MAX;
for i in n..=2 * n {
ans = ans.min(pre[i] - suf[i + 1]);
}
ans
}
}
```
<!-- tabs:end -->
<!-- solution:end -->

View File

@ -264,25 +264,25 @@ function minimumDifference(nums: number[]): number {
const n = Math.floor(m / 3);
let s = 0;
const pre: number[] = Array(m + 1);
const q1 = new MaxPriorityQueue();
const q1 = new MaxPriorityQueue<number>();
for (let i = 1; i <= n * 2; ++i) {
const x = nums[i - 1];
s += x;
q1.enqueue(x, x);
q1.enqueue(x);
if (q1.size() > n) {
s -= q1.dequeue().element;
s -= q1.dequeue();
}
pre[i] = s;
}
s = 0;
const suf: number[] = Array(m + 1);
const q2 = new MinPriorityQueue();
const q2 = new MinPriorityQueue<number>();
for (let i = m; i > n; --i) {
const x = nums[i - 1];
s += x;
q2.enqueue(x, x);
q2.enqueue(x);
if (q2.size() > n) {
s -= q2.dequeue().element;
s -= q2.dequeue();
}
suf[i] = s;
}
@ -294,6 +294,58 @@ function minimumDifference(nums: number[]): number {
}
```
#### Rust
```rust
use std::collections::BinaryHeap;
use std::cmp::Reverse;
impl Solution {
pub fn minimum_difference(nums: Vec<i32>) -> i64 {
let m = nums.len();
let n = m / 3;
let mut s = 0i64;
let mut pre = vec![0i64; m + 1];
let mut pq = BinaryHeap::new(); // max-heap
for i in 1..=2 * n {
let x = nums[i - 1] as i64;
s += x;
pq.push(x);
if pq.len() > n {
if let Some(top) = pq.pop() {
s -= top;
}
}
pre[i] = s;
}
s = 0;
let mut suf = vec![0i64; m + 1];
let mut pq = BinaryHeap::new();
for i in (n + 1..=m).rev() {
let x = nums[i - 1] as i64;
s += x;
pq.push(Reverse(x));
if pq.len() > n {
if let Some(Reverse(top)) = pq.pop() {
s -= top;
}
}
suf[i] = s;
}
let mut ans = i64::MAX;
for i in n..=2 * n {
ans = ans.min(pre[i] - suf[i + 1]);
}
ans
}
}
```
<!-- tabs:end -->
<!-- solution:end -->

View File

@ -0,0 +1,47 @@
use std::cmp::Reverse;
use std::collections::BinaryHeap;
impl Solution {
pub fn minimum_difference(nums: Vec<i32>) -> i64 {
let m = nums.len();
let n = m / 3;
let mut s = 0i64;
let mut pre = vec![0i64; m + 1];
let mut pq = BinaryHeap::new(); // max-heap
for i in 1..=2 * n {
let x = nums[i - 1] as i64;
s += x;
pq.push(x);
if pq.len() > n {
if let Some(top) = pq.pop() {
s -= top;
}
}
pre[i] = s;
}
s = 0;
let mut suf = vec![0i64; m + 1];
let mut pq = BinaryHeap::new();
for i in (n + 1..=m).rev() {
let x = nums[i - 1] as i64;
s += x;
pq.push(Reverse(x));
if pq.len() > n {
if let Some(Reverse(top)) = pq.pop() {
s -= top;
}
}
suf[i] = s;
}
let mut ans = i64::MAX;
for i in n..=2 * n {
ans = ans.min(pre[i] - suf[i + 1]);
}
ans
}
}

View File

@ -3,25 +3,25 @@ function minimumDifference(nums: number[]): number {
const n = Math.floor(m / 3);
let s = 0;
const pre: number[] = Array(m + 1);
const q1 = new MaxPriorityQueue();
const q1 = new MaxPriorityQueue<number>();
for (let i = 1; i <= n * 2; ++i) {
const x = nums[i - 1];
s += x;
q1.enqueue(x, x);
q1.enqueue(x);
if (q1.size() > n) {
s -= q1.dequeue().element;
s -= q1.dequeue();
}
pre[i] = s;
}
s = 0;
const suf: number[] = Array(m + 1);
const q2 = new MinPriorityQueue();
const q2 = new MinPriorityQueue<number>();
for (let i = m; i > n; --i) {
const x = nums[i - 1];
s += x;
q2.enqueue(x, x);
q2.enqueue(x);
if (q2.size() > n) {
s -= q2.dequeue().element;
s -= q2.dequeue();
}
suf[i] = s;
}