Skip to content

Commit 21417af

Browse files
authored
2025-03-07 v. 8.8.6: added "1834. Single-Threaded CPU"
2 parents 1f4ac60 + 180ee87 commit 21417af

File tree

4 files changed

+127
-1
lines changed

4 files changed

+127
-1
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -719,6 +719,7 @@ Profile on LeetCode: [fartem](https://leetcode.com/fartem/).
719719
| 1814. Count Nice Pairs in an Array | [Link](https://leetcode.com/problems/count-nice-pairs-in-an-array/) | [Link](./lib/medium/1814_count_nice_pairs_in_an_array.rb) | [Link](./test/medium/test_1814_count_nice_pairs_in_an_array.rb) |
720720
| 1823. Find the Winner of the Circular Game | [Link](https://leetcode.com/problems/find-the-winner-of-the-circular-game/) | [Link](./lib/medium/1823_find_the_winner_of_the_circular_game.rb) | [Link](./test/medium/test_1823_find_the_winner_of_the_circular_game.rb) |
721721
| 1829. Maximum XOR for Each Query | [Link](https://leetcode.com/problems/maximum-xor-for-each-query/) | [Link](./lib/medium/1829_maximum_xor_for_each_query.rb) | [Link](./test/medium/test_1829_maximum_xor_for_each_query.rb) |
722+
| 1834. Single-Threaded CPU | [Link](https://leetcode.com/problems/single-threaded-cpu/) | [Link](./lib/medium/1834_single_threaded_cpu.rb) | [Link](./test/medium/test_1834_single_threaded_cpu.rb) |
722723
| 2116. Check if a Parentheses String Can Be Valid | [Link](https://leetcode.com/problems/check-if-a-parentheses-string-can-be-valid/) | [Link](./lib/medium/2116_check_if_a_parentheses_string_can_be_valid.rb) | [Link](./test/medium/test_2116_check_if_a_parentheses_string_can_be_valid.rb) |
723724
| 2425. Bitwise XOR of All Pairings | [Link](https://leetcode.com/problems/bitwise-xor-of-all-pairings/) | [Link](./lib/medium/2425_bitwise_xor_of_all_pairings.rb) | [Link](./test/medium/test_2425_bitwise_xor_of_all_pairings.rb) |
724725
| 2429. Minimize XOR | [Link](https://leetcode.com/problems/minimize-xor/) | [Link](./lib/medium/2429_minimize_xor.rb) | [Link](./test/medium/test_2429_minimize_xor.rb) |

leetcode-ruby.gemspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ require 'English'
55
::Gem::Specification.new do |s|
66
s.required_ruby_version = '>= 3.0'
77
s.name = 'leetcode-ruby'
8-
s.version = '8.8.5'
8+
s.version = '8.8.6'
99
s.license = 'MIT'
1010
s.files = ::Dir['lib/**/*.rb'] + %w[README.md]
1111
s.executable = 'leetcode-ruby'
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
# frozen_string_literal: true
2+
3+
# https://leetcode.com/problems/single-threaded-cpu/
4+
# @param {Integer[][]} tasks
5+
# @return {Integer[]}
6+
def get_order(tasks)
7+
sorted_tasks = tasks.each_with_index.map { |t, idx| [t[0], t[1], idx] }.sort_by { |et, _, _| et }
8+
9+
current_time = 0
10+
result = []
11+
i = 0
12+
heap = []
13+
14+
while i < sorted_tasks.size || !heap.empty?
15+
while i < sorted_tasks.size && sorted_tasks[i][0] <= current_time
16+
insert_heap(heap, [sorted_tasks[i][1], sorted_tasks[i][2]])
17+
i += 1
18+
end
19+
20+
if heap.empty? && i < sorted_tasks.size
21+
current_time = sorted_tasks[i][0]
22+
while i < sorted_tasks.size && sorted_tasks[i][0] <= current_time
23+
insert_heap(heap, [sorted_tasks[i][1], sorted_tasks[i][2]])
24+
i += 1
25+
end
26+
end
27+
28+
next if heap.empty?
29+
30+
pt, idx = extract_min(heap)
31+
result << idx
32+
current_time += pt
33+
end
34+
35+
result
36+
end
37+
38+
private
39+
40+
# @param {Integer[]} heap
41+
# @param {Integer} element
42+
# @return {Void}
43+
def insert_heap(heap, element)
44+
heap << element
45+
index = heap.size - 1
46+
47+
while index.positive?
48+
parent = (index - 1) / 2
49+
50+
break unless compare(element, heap[parent])
51+
52+
heap[index], heap[parent] = heap[parent], heap[index]
53+
index = parent
54+
end
55+
end
56+
57+
# @param {Integer[]} heap
58+
# @return {Integer}
59+
def extract_min(heap)
60+
return if heap.empty?
61+
62+
min = heap[0]
63+
last = heap.pop
64+
65+
unless heap.empty?
66+
heap[0] = last
67+
index = 0
68+
loop do
69+
left = 2 * index + 1
70+
right = 2 * index + 2
71+
smallest = index
72+
73+
smallest = left if left < heap.size && compare(heap[left], heap[smallest])
74+
smallest = right if right < heap.size && compare(heap[right], heap[smallest])
75+
76+
break if smallest == index
77+
78+
heap[index], heap[smallest] = heap[smallest], heap[index]
79+
index = smallest
80+
end
81+
end
82+
83+
min
84+
end
85+
86+
# @param {Integer} a
87+
# @param {Integer} b
88+
# @return {Integer}
89+
def compare(a, b) = a[0] < b[0] || (a[0] == b[0] && a[1] < b[1])
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
# frozen_string_literal: true
2+
3+
require_relative '../test_helper'
4+
require_relative '../../lib/medium/1834_single_threaded_cpu'
5+
require 'minitest/autorun'
6+
7+
class SingleThreasedCPUTest < ::Minitest::Test
8+
def test_default_one
9+
assert_equal(
10+
[0, 2, 3, 1],
11+
get_order(
12+
[
13+
[1, 2],
14+
[2, 4],
15+
[3, 2],
16+
[4, 1]
17+
]
18+
)
19+
)
20+
end
21+
22+
def test_default_two
23+
assert_equal(
24+
[4, 3, 2, 0, 1],
25+
get_order(
26+
[
27+
[7, 10],
28+
[7, 12],
29+
[7, 5],
30+
[7, 4],
31+
[7, 2]
32+
]
33+
)
34+
)
35+
end
36+
end

0 commit comments

Comments
 (0)