Given an integer array nums where nums[i] is either a positive integer or
-1. We need to find for each -1 the respective positive integer, which we call the last visited integer.
To achieve this goal, let’s define two empty arrays: seen and ans.
Start iterating from the beginning of the array nums.
If a positive integer is encountered, prepend it to the front of seen.
If -1 is encountered, let k be the number of consecutive-1s seen so far (including the current -1),
If k is less than or equal to the length of seen, append the k-th element of seen to ans.
If k is strictly greater than the length of seen, append -1 to ans.
Input: nums =[1,2,-1,-1,-1]Output: [2,1,-1]Explanation:
Start with`seen = []` and `ans = []`.1. Process `nums[0]`: The first element in nums is`1`. We prepend it to the front of `seen`. Now,`seen == [1]`.2. Process `nums[1]`: The next element is`2`. We prepend it to the front of `seen`. Now,`seen == [2, 1]`.3. Process `nums[2]`: The next element is`-1`. This is the first occurrence of `-1`, so `k == 1`. We look for the first element in seen. We append `2` to `ans`. Now,`ans == [2]`.4. Process `nums[3]`: Another `-1`. This is the second consecutive `-1`, so `k == 2`. The second element in`seen`is`1`, so we append `1` to `ans`. Now,`ans == [2, 1]`.5. Process `nums[4]`: Another `-1`, the third in a row, making `k = 3`. However,`seen` only has two elements(`[2, 1]`). Since `k`is greater than the number of elements in`seen`, we append `-1` to `ans`. Finally,`ans == [2, 1, -1]`.
Input: nums =[1,-1,2,-1,-1]Output: [1,2,1]Explanation:
Start with`seen = []` and `ans = []`.1. Process `nums[0]`: The first element in nums is`1`. We prepend it to the front of `seen`. Now,`seen == [1]`.2. Process `nums[1]`: The next element is`-1`. This is the first occurrence of `-1`, so `k == 1`. We look for the first element in`seen`, which is`1`. Append `1` to `ans`. Now,`ans == [1]`.3. Process `nums[2]`: The next element is`2`. Prepend this to the front of `seen`. Now,`seen == [2, 1]`.4. Process `nums[3]`: The next element is`-1`. This `-1`is not consecutive to the first `-1` since `2` was in between. Thus,`k` resets to `1`. The first element in`seen`is`2`, so append `2` to `ans`. Now,`ans == [1, 2]`.5. Process `nums[4]`: Another `-1`. This is consecutive to the previous `-1`, so `k == 2`. The second element in`seen`is`1`, append `1` to `ans`. Finally,`ans == [1, 2, 1]`.
We simulate the process as described: maintain a deque for the seen numbers and count consecutive -1s to answer each query. This is a direct simulation problem.
Initialize an empty deque seen and an empty list ans.
Iterate through nums:
If the number is positive, prepend it to seen and reset the consecutive -1 counter.
If the number is -1, increment the counter, and if the counter is less than or equal to the length of seen, append the k-th element of seen to ans, else append -1.
classSolution {
public List<Integer>lastVisitedIntegers(int[] nums) {
LinkedList<Integer> seen =new LinkedList<>();
List<Integer> ans =new ArrayList<>();
int k = 0;
for (int x : nums) {
if (x ==-1) {
k++;
if (k <= seen.size()) ans.add(seen.get(k-1));
else ans.add(-1);
} else {
seen.addFirst(x);
k = 0;
}
}
return ans;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
classSolution {
funlastVisitedIntegers(nums: IntArray): List<Int> {
val seen = ArrayDeque<Int>()
val ans = mutableListOf<Int>()
var k = 0for (x in nums) {
if (x == -1) {
k++if (k <= seen.size) ans.add(seen.elementAt(k-1))
else ans.add(-1)
} else {
seen.addFirst(x)
k = 0 }
}
return ans
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
classSolution:
deflastVisitedIntegers(self, nums: list[int]) -> list[int]:
from collections import deque
seen = deque()
ans = []
k =0for x in nums:
if x ==-1:
k +=1if k <= len(seen):
ans.append(seen[k-1])
else:
ans.append(-1)
else:
seen.appendleft(x)
k =0return ans
impl Solution {
pubfnlast_visited_integers(nums: Vec<i32>) -> Vec<i32> {
letmut seen = std::collections::VecDeque::new();
letmut ans =vec![];
letmut k =0;
for x in nums {
if x ==-1 {
k +=1;
if k <= seen.len() {
ans.push(seen[k-1]);
} else {
ans.push(-1);
}
} else {
seen.push_front(x);
k =0;
}
}
ans
}
}