Post

2434 Design A Number Container System

2434 Design A Number Container System

Design a Number Container System image

Design a number container system that can do the following:

1
2
**Insert **or **Replace** a number at the given index in the system.
**Return **the smallest index for the given number in the system.

Implement the NumberContainers class:

1
2
3
NumberContainers() Initializes the number container system.
void change(int index, int number) Fills the container at index with the number. If there is already a number at that index, replace it.
int find(int number) Returns the smallest index for the given number, or -1 if there is no index that is filled by number in the system.

 

Example 1:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
**Input**
["NumberContainers", "find", "change", "change", "change", "change", "find", "change", "find"]
[[], [10], [2, 10], [1, 10], [3, 10], [5, 10], [10], [1, 20], [10]]
**Output**
[null, -1, null, null, null, null, 1, null, 2]

**Explanation**
NumberContainers nc = new NumberContainers();
nc.find(10); // There is no index that is filled with number 10. Therefore, we return -1.
nc.change(2, 10); // Your container at index 2 will be filled with number 10.
nc.change(1, 10); // Your container at index 1 will be filled with number 10.
nc.change(3, 10); // Your container at index 3 will be filled with number 10.
nc.change(5, 10); // Your container at index 5 will be filled with number 10.
nc.find(10); // Number 10 is at the indices 1, 2, 3, and 5. Since the smallest index that is filled with 10 is 1, we return 1.
nc.change(1, 20); // Your container at index 1 will be filled with number 20. Note that index 1 was filled with 10 and then replaced with 20. 
nc.find(10); // Number 10 is at the indices 2, 3, and 5. The smallest index that is filled with 10 is 2. Therefore, we return 2.

 

Constraints:

1
2
1 <= index, number <= 109
At most 105 calls will be made **in total** to change and find.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72

import (
	"fmt"
	"github.com/emirpasic/gods/trees/redblacktree"
)

// NumberContainers struct
type NumberContainers struct {
	index map[int]int                    // Maps index → number
	num   map[int]*redblacktree.Tree // Maps number → ordered indices
}

// Constructor initializes the NumberContainers structure
func Constructor() NumberContainers {
	return NumberContainers{
		index: make(map[int]int),
		num:   make(map[int]*redblacktree.Tree),
	}
}

// insert inserts index into the Red-Black Tree
func insert(tree *redblacktree.Tree, index int) {
	tree.Put(index, nil) // Red-Black Tree automatically keeps elements sorted
}

// del removes index from the Red-Black Tree
func del(tree *redblacktree.Tree, index int) {
	tree.Remove(index)
}

// Change updates the mapping from index → number and maintains sorted indices
func (this *NumberContainers) Change(index int, number int) {
	oldNumber, exists := this.index[index]

	// Update index map
	this.index[index] = number

	// If the index existed before, remove it from the previous number's tree
	if exists {
		oldTree, ok := this.num[oldNumber]
		if ok {
			del(oldTree, index)
			if oldTree.Size() == 0 {
				delete(this.num, oldNumber) // Remove empty trees
			}
		}
	}

	// Insert into the new number's tree
	_, ok := this.num[number]
	if !ok {
		this.num[number] = redblacktree.NewWithIntComparator()
	}
	insert(this.num[number], index)
}

// Find returns the smallest index associated with the number
func (this *NumberContainers) Find(number int) int {
	tree, ok := this.num[number]
	if !ok || tree.Size() == 0 {
		return -1
	}
	minNode := tree.Left()
	if minNode == nil {
		return -1
	}
	return minNode.Key.(int)
}



This post is licensed under CC BY 4.0 by the author.