Skip to content

Commit 36d9864

Browse files
committed
Update
1 parent ed72dca commit 36d9864

File tree

7 files changed

+342
-0
lines changed

7 files changed

+342
-0
lines changed
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package array;
2+
3+
import java.util.LinkedList;
4+
import java.util.Queue;
5+
6+
/**
7+
* Description: https://leetcode.com/problems/longest-subarray-of-1s-after-deleting-one-element
8+
* Difficulty: Medium
9+
*/
10+
public class LongestSubarrayOfOnesAfterDeletingOneElement {
11+
12+
/**
13+
* Time complexity: O(n)
14+
* Space complexity: O(1)
15+
*/
16+
public int longestSubarray(int[] nums) {
17+
int left = 0;
18+
int right = 0;
19+
int removalsLeft = 1;
20+
21+
while (right < nums.length) {
22+
if (nums[right] == 0) removalsLeft--;
23+
if (removalsLeft < 0) {
24+
if (nums[left] == 0) removalsLeft++;
25+
left++;
26+
}
27+
28+
right++;
29+
}
30+
31+
return right - left - 1;
32+
}
33+
34+
/**
35+
* Time complexity: O(n)
36+
* Space complexity: O(k)
37+
*/
38+
public int longestSubarrayForDataStream(int[] nums) {
39+
int left = 0;
40+
int longest = 0;
41+
Queue<Integer> zeroes = new LinkedList<>();
42+
for (int right = 0; right < nums.length; right++) {
43+
if (nums[right] == 0) zeroes.offer(right);
44+
if (zeroes.size() > 1) {
45+
left = zeroes.poll() + 1;
46+
}
47+
48+
longest = Math.max(longest, right - left);
49+
}
50+
51+
return longest;
52+
}
53+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package array;
2+
3+
import java.util.Arrays;
4+
5+
/**
6+
* Description: https://leetcode.com/problems/max-number-of-k-sum-pairs
7+
* Difficulty: Medium
8+
* Time complexity: O(nlog n)
9+
* Space complexity: O(log n)
10+
*/
11+
public class MaxNumberOfKSumPairs {
12+
13+
public int maxOperations(int[] nums, int k) {
14+
Arrays.sort(nums);
15+
16+
int left = 0;
17+
int right = nums.length - 1;
18+
int pairs = 0;
19+
while (left < right) {
20+
int sum = nums[left] + nums[right];
21+
if (sum > k) {
22+
right--;
23+
} else if (sum < k) {
24+
left++;
25+
} else {
26+
pairs++;
27+
left++;
28+
right--;
29+
}
30+
}
31+
32+
return pairs;
33+
}
34+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package design;
2+
3+
import java.util.LinkedList;
4+
import java.util.Queue;
5+
6+
/**
7+
* Description: https://leetcode.com/problems/number-of-recent-calls
8+
* Difficulty: Easy
9+
* Time complexity: O(n)
10+
* Space complexity: O(n)
11+
*/
12+
public class NumberOfRecentCalls {
13+
14+
private static class RecentCounterViaQueue {
15+
16+
private final Queue<Integer> hits;
17+
18+
public RecentCounterViaQueue() {
19+
this.hits = new LinkedList<>();
20+
}
21+
22+
public int ping(int timestamp) {
23+
hits.offer(timestamp);
24+
while (!hits.isEmpty() && timestamp - hits.peek() > 3000) {
25+
hits.poll();
26+
}
27+
28+
return hits.size();
29+
}
30+
}
31+
}

src/design/SnapshotArray.java

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package design;
2+
3+
import java.util.TreeMap;
4+
5+
/**
6+
* Description: https://leetcode.com/problems/snapshot-array
7+
* Difficulty: Medium
8+
* Time complexity: O(log n) for get(), O(1) for set() and snap()
9+
* Space complexity: O(n)
10+
*/
11+
public class SnapshotArray {
12+
13+
private static class SnapshotArrayViaTreeMap {
14+
15+
private final TreeMap<Integer, Integer>[] versionedValues;
16+
private int currentVersion;
17+
18+
public SnapshotArrayViaTreeMap(int length) {
19+
this.versionedValues = new TreeMap[length];
20+
for (int i = 0; i < length; i++) {
21+
TreeMap<Integer, Integer> map = new TreeMap<>();
22+
map.put(0 ,0);
23+
versionedValues[i] = map;
24+
}
25+
}
26+
27+
public void set(int index, int val) {
28+
versionedValues[index].put(currentVersion, val);
29+
}
30+
31+
public int snap() {
32+
return currentVersion++;
33+
}
34+
35+
public int get(int index, int snapshotId) {
36+
// find first less than or equal version
37+
return versionedValues[index].floorEntry(snapshotId).getValue();
38+
}
39+
}
40+
}
41+
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package graph;
2+
3+
import java.util.*;
4+
5+
/**
6+
* Description: https://leetcode.com/problems/reconstruct-itinerary
7+
* Difficulty: Hard
8+
* Time complexity: O(V ^ E)
9+
* Space complexity: O(V + E)
10+
*/
11+
public class ReconstructItinerary {
12+
13+
private static final String START = "JFK";
14+
15+
public List<String> findItinerary(List<List<String>> tickets) {
16+
Map<String, List<Ticket>> adjList = buildAdjList(tickets);
17+
18+
List<String> itinerary = new ArrayList<>();
19+
itinerary.add(START);
20+
int[] usedTickets = new int[tickets.size()];
21+
22+
return findItinerary(START, adjList, usedTickets, itinerary);
23+
}
24+
25+
private List<String> findItinerary(
26+
String current,
27+
Map<String, List<Ticket>> adjList,
28+
int[] usedTickets,
29+
List<String> currentItinerary) {
30+
if (currentItinerary.size() == usedTickets.length + 1) {
31+
return currentItinerary;
32+
}
33+
34+
for (Ticket next : adjList.getOrDefault(current, List.of())) {
35+
if (usedTickets[next.index] == 0) {
36+
usedTickets[next.index] = 1;
37+
currentItinerary.add(next.destination);
38+
39+
List<String> itinerary = findItinerary(next.destination, adjList, usedTickets, currentItinerary);
40+
if (!itinerary.isEmpty()) return itinerary;
41+
42+
usedTickets[next.index] = 0;
43+
currentItinerary.remove(currentItinerary.size() - 1);
44+
}
45+
}
46+
47+
return List.of();
48+
}
49+
50+
private Map<String, List<Ticket>> buildAdjList(List<List<String>> tickets) {
51+
Map<String, List<Ticket>> adjList = new HashMap<>();
52+
for (int i = 0; i < tickets.size(); i++) {
53+
List<String> ticket = tickets.get(i);
54+
adjList.computeIfAbsent(ticket.get(0), __ -> new ArrayList<>()).add(new Ticket(ticket.get(1), i));
55+
}
56+
57+
for (List<Ticket> t : adjList.values()) {
58+
t.sort(Comparator.comparing(a -> a.destination));
59+
}
60+
61+
return adjList;
62+
}
63+
64+
private record Ticket(String destination, int index) {
65+
}
66+
}

src/graph/SnakesAndLadders.java

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package graph;
2+
3+
import java.util.LinkedList;
4+
import java.util.Queue;
5+
6+
/**
7+
* Description: https://leetcode.com/problems/snakes-and-ladders
8+
* Difficulty: Medium
9+
* Time complexity: O(n * n)
10+
* Space complexity: O(n * n)
11+
*/
12+
public class SnakesAndLadders {
13+
14+
public int snakesAndLadders(int[][] board) {
15+
int[] labels = initLabels(board);
16+
return findShortestPath(board, labels);
17+
}
18+
19+
private int findShortestPath(int[][] board, int[] labels) {
20+
Queue<Integer> planned = new LinkedList<>();
21+
planned.offer(1);
22+
int[] visited = new int[board.length * board.length + 1];
23+
visited[1] = 1;
24+
25+
int path = 0;
26+
while (!planned.isEmpty()) {
27+
int levelSize = planned.size();
28+
path++;
29+
30+
for (int i = 0; i < levelSize; i++) {
31+
int current = planned.poll();
32+
for (int next = current + 1; next <= Math.min(current + 6, board.length * board.length); next++) {
33+
int destination = labels[next] > 0 ? labels[next] : next; // check for possible snake or ladder
34+
if (destination == board.length * board.length) return path;
35+
36+
if (visited[destination] == 0) {
37+
planned.offer(destination);
38+
visited[destination] = 1;
39+
}
40+
}
41+
}
42+
}
43+
44+
return -1;
45+
}
46+
47+
private int[] initLabels(int[][] board) {
48+
int[] labels = new int[board.length * board.length + 1];
49+
boolean goRight = true;
50+
int val = 1;
51+
for (int row = board.length - 1; row >= 0; row--) {
52+
for (int col = 0; col < board[0].length; col++) {
53+
labels[val++] = goRight ? board[row][col] : board[row][board[0].length - col - 1];
54+
}
55+
56+
goRight = !goRight;
57+
}
58+
59+
return labels;
60+
}
61+
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package matrix;
2+
3+
import java.util.Arrays;
4+
import java.util.HashMap;
5+
import java.util.Map;
6+
7+
/**
8+
* Description: https://leetcode.com/problems/equal-row-and-column-pairs
9+
* Difficulty: Medium
10+
* Time complexity: O(n^3)
11+
* Space complexity: O(n^2)
12+
*/
13+
public class EqualRowAndColumnPairs {
14+
15+
public int equalPairsViaFreqMap(int[][] grid) {
16+
Map<String, Integer> freqMap = new HashMap<>();
17+
for (int[] row : grid) {
18+
freqMap.merge(Arrays.toString(row), 1, Integer::sum);
19+
}
20+
21+
int pairs = 0;
22+
for (int col = 0; col < grid[0].length; col++) {
23+
int[] column = new int[grid.length];
24+
for (int row = 0; row < grid[0].length; row++) {
25+
column[row] = grid[row][col];
26+
}
27+
28+
pairs += freqMap.getOrDefault(Arrays.toString(column), 0);
29+
}
30+
31+
return pairs;
32+
}
33+
34+
public int equalPairsViaTransposition(int[][] grid) {
35+
int[][] transposed = transpose(grid);
36+
int pairs = 0;
37+
for (int[] originalRow : grid) {
38+
for (int[] transposedRow : transposed) {
39+
if (Arrays.equals(originalRow, transposedRow)) pairs++;
40+
}
41+
}
42+
43+
return pairs;
44+
}
45+
46+
private int[][] transpose(int[][] grid) {
47+
int[][] transposed = new int[grid[0].length][grid.length];
48+
for (int i = 0; i < grid.length; i++) {
49+
for (int j = 0; j < grid[0].length; j++) {
50+
transposed[j][i] = grid[i][j];
51+
}
52+
}
53+
54+
return transposed;
55+
}
56+
}

0 commit comments

Comments
 (0)