Skip to content

Commit 9fc3380

Browse files
authored
Added tasks 3105-3108
1 parent 312a89c commit 9fc3380

File tree

12 files changed

+478
-0
lines changed

12 files changed

+478
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package g3101_3200.s3105_longest_strictly_increasing_or_strictly_decreasing_subarray
2+
3+
// #Easy #Array #2024_04_13_Time_159_ms_(94.00%)_Space_36.4_MB_(92.00%)
4+
5+
import kotlin.math.max
6+
7+
class Solution {
8+
fun longestMonotonicSubarray(nums: IntArray): Int {
9+
var inc = 1
10+
var dec = 1
11+
var res = 1
12+
for (i in 1 until nums.size) {
13+
if (nums[i] > nums[i - 1]) {
14+
inc += 1
15+
dec = 1
16+
} else if (nums[i] < nums[i - 1]) {
17+
dec += 1
18+
inc = 1
19+
} else {
20+
inc = 1
21+
dec = 1
22+
}
23+
res = max(res, max(inc, dec))
24+
}
25+
return res
26+
}
27+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
3105\. Longest Strictly Increasing or Strictly Decreasing Subarray
2+
3+
Easy
4+
5+
You are given an array of integers `nums`. Return _the length of the **longest** subarray of_ `nums` _which is either **strictly increasing** or **strictly decreasing**_.
6+
7+
**Example 1:**
8+
9+
**Input:** nums = [1,4,3,3,2]
10+
11+
**Output:** 2
12+
13+
**Explanation:**
14+
15+
The strictly increasing subarrays of `nums` are `[1]`, `[2]`, `[3]`, `[3]`, `[4]`, and `[1,4]`.
16+
17+
The strictly decreasing subarrays of `nums` are `[1]`, `[2]`, `[3]`, `[3]`, `[4]`, `[3,2]`, and `[4,3]`.
18+
19+
Hence, we return `2`.
20+
21+
**Example 2:**
22+
23+
**Input:** nums = [3,3,3,3]
24+
25+
**Output:** 1
26+
27+
**Explanation:**
28+
29+
The strictly increasing subarrays of `nums` are `[3]`, `[3]`, `[3]`, and `[3]`.
30+
31+
The strictly decreasing subarrays of `nums` are `[3]`, `[3]`, `[3]`, and `[3]`.
32+
33+
Hence, we return `1`.
34+
35+
**Example 3:**
36+
37+
**Input:** nums = [3,2,1]
38+
39+
**Output:** 3
40+
41+
**Explanation:**
42+
43+
The strictly increasing subarrays of `nums` are `[3]`, `[2]`, and `[1]`.
44+
45+
The strictly decreasing subarrays of `nums` are `[3]`, `[2]`, `[1]`, `[3,2]`, `[2,1]`, and `[3,2,1]`.
46+
47+
Hence, we return `3`.
48+
49+
**Constraints:**
50+
51+
* `1 <= nums.length <= 50`
52+
* `1 <= nums[i] <= 50`
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package g3101_3200.s3106_lexicographically_smallest_string_after_operations_with_constraint
2+
3+
// #Medium #String #Greedy #2024_04_13_Time_162_ms_(74.19%)_Space_36.2_MB_(77.42%)
4+
5+
import kotlin.math.abs
6+
import kotlin.math.min
7+
8+
@Suppress("NAME_SHADOWING")
9+
class Solution {
10+
fun getSmallestString(s: String, k: Int): String {
11+
var k = k
12+
val sArray = s.toCharArray()
13+
for (i in sArray.indices) {
14+
val distToA = cyclicDistance(sArray[i], 'a')
15+
if (distToA <= k) {
16+
sArray[i] = 'a'
17+
k -= distToA
18+
} else if (k > 0) {
19+
sArray[i] = (sArray[i].code - k).toChar()
20+
k = 0
21+
}
22+
}
23+
return String(sArray)
24+
}
25+
26+
private fun cyclicDistance(ch1: Char, ch2: Char): Int {
27+
val dist = abs(ch1.code - ch2.code)
28+
return min(dist, (26 - dist))
29+
}
30+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
3106\. Lexicographically Smallest String After Operations With Constraint
2+
3+
Medium
4+
5+
You are given a string `s` and an integer `k`.
6+
7+
Define a function <code>distance(s<sub>1</sub>, s<sub>2</sub>)</code> between two strings <code>s<sub>1</sub></code> and <code>s<sub>2</sub></code> of the same length `n` as:
8+
9+
* The **sum** of the **minimum distance** between <code>s<sub>1</sub>[i]</code> and <code>s<sub>2</sub>[i]</code> when the characters from `'a'` to `'z'` are placed in a **cyclic** order, for all `i` in the range `[0, n - 1]`.
10+
11+
For example, `distance("ab", "cd") == 4`, and `distance("a", "z") == 1`.
12+
13+
You can **change** any letter of `s` to **any** other lowercase English letter, **any** number of times.
14+
15+
Return a string denoting the **lexicographically smallest** string `t` you can get after some changes, such that `distance(s, t) <= k`.
16+
17+
**Example 1:**
18+
19+
**Input:** s = "zbbz", k = 3
20+
21+
**Output:** "aaaz"
22+
23+
**Explanation:**
24+
25+
Change `s` to `"aaaz"`. The distance between `"zbbz"` and `"aaaz"` is equal to `k = 3`.
26+
27+
**Example 2:**
28+
29+
**Input:** s = "xaxcd", k = 4
30+
31+
**Output:** "aawcd"
32+
33+
**Explanation:**
34+
35+
The distance between "xaxcd" and "aawcd" is equal to k = 4.
36+
37+
**Example 3:**
38+
39+
**Input:** s = "lol", k = 0
40+
41+
**Output:** "lol"
42+
43+
**Explanation:**
44+
45+
It's impossible to change any character as `k = 0`.
46+
47+
**Constraints:**
48+
49+
* `1 <= s.length <= 100`
50+
* `0 <= k <= 2000`
51+
* `s` consists only of lowercase English letters.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package g3101_3200.s3107_minimum_operations_to_make_median_of_array_equal_to_k
2+
3+
// #Medium #Array #Sorting #Greedy #2024_04_13_Time_554_ms_(100.00%)_Space_82.2_MB_(68.00%)
4+
5+
import kotlin.math.abs
6+
7+
class Solution {
8+
fun minOperationsToMakeMedianK(nums: IntArray, k: Int): Long {
9+
nums.sort()
10+
val n = nums.size
11+
val medianIndex = n / 2
12+
var result: Long = 0
13+
var totalElements = 0
14+
var totalSum: Long = 0
15+
var i = medianIndex
16+
if (nums[medianIndex] > k) {
17+
while (i >= 0 && nums[i] > k) {
18+
totalElements += 1
19+
totalSum += nums[i].toLong()
20+
i -= 1
21+
}
22+
} else if (nums[medianIndex] < k) {
23+
while (i < n && nums[i] < k) {
24+
totalElements += 1
25+
totalSum += nums[i].toLong()
26+
i += 1
27+
}
28+
}
29+
result += abs(totalSum - (totalElements.toLong() * k))
30+
return result
31+
}
32+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
3107\. Minimum Operations to Make Median of Array Equal to K
2+
3+
Medium
4+
5+
You are given an integer array `nums` and a **non-negative** integer `k`. In one operation, you can increase or decrease any element by 1.
6+
7+
Return the **minimum** number of operations needed to make the **median** of `nums` _equal_ to `k`.
8+
9+
The median of an array is defined as the middle element of the array when it is sorted in non-decreasing order. If there are two choices for a median, the larger of the two values is taken.
10+
11+
**Example 1:**
12+
13+
**Input:** nums = [2,5,6,8,5], k = 4
14+
15+
**Output:** 2
16+
17+
**Explanation:**
18+
19+
We can subtract one from `nums[1]` and `nums[4]` to obtain `[2, 4, 6, 8, 4]`. The median of the resulting array is equal to `k`.
20+
21+
**Example 2:**
22+
23+
**Input:** nums = [2,5,6,8,5], k = 7
24+
25+
**Output:** 3
26+
27+
**Explanation:**
28+
29+
We can add one to `nums[1]` twice and add one to `nums[2]` once to obtain `[2, 7, 7, 8, 5]`.
30+
31+
**Example 3:**
32+
33+
**Input:** nums = [1,2,3,4,5,6], k = 4
34+
35+
**Output:** 0
36+
37+
**Explanation:**
38+
39+
The median of the array is already equal to `k`.
40+
41+
**Constraints:**
42+
43+
* <code>1 <= nums.length <= 2 * 10<sup>5</sup></code>
44+
* <code>1 <= nums[i] <= 10<sup>9</sup></code>
45+
* <code>1 <= k <= 10<sup>9</sup></code>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package g3101_3200.s3108_minimum_cost_walk_in_weighted_graph
2+
3+
// #Hard #Array #Bit_Manipulation #Graph #Union_Find
4+
// #2024_04_13_Time_791_ms_(100.00%)_Space_139.3_MB_(26.67%)
5+
6+
@Suppress("NAME_SHADOWING")
7+
class Solution {
8+
fun minimumCost(n: Int, edges: Array<IntArray>, query: Array<IntArray>): IntArray {
9+
val parent = IntArray(n)
10+
val bitwise = IntArray(n)
11+
val size = IntArray(n)
12+
var i = 0
13+
while (i < n) {
14+
parent[i] = i
15+
size[i] = 1
16+
bitwise[i] = -1
17+
i++
18+
}
19+
val len = edges.size
20+
i = 0
21+
while (i < len) {
22+
val node1 = edges[i][0]
23+
val node2 = edges[i][1]
24+
val weight = edges[i][2]
25+
val parent1 = findParent(node1, parent)
26+
val parent2 = findParent(node2, parent)
27+
if (parent1 == parent2) {
28+
bitwise[parent1] = bitwise[parent1] and weight
29+
} else {
30+
var bitwiseVal: Int
31+
val check1 = bitwise[parent1] == -1
32+
val check2 = bitwise[parent2] == -1
33+
bitwiseVal = if (check1 && check2) {
34+
weight
35+
} else if (check1) {
36+
weight and bitwise[parent2]
37+
} else if (check2) {
38+
weight and bitwise[parent1]
39+
} else {
40+
weight and bitwise[parent1] and bitwise[parent2]
41+
}
42+
if (size[parent1] >= size[parent2]) {
43+
parent[parent2] = parent1
44+
size[parent1] += size[parent2]
45+
bitwise[parent1] = bitwiseVal
46+
} else {
47+
parent[parent1] = parent2
48+
size[parent2] += size[parent1]
49+
bitwise[parent2] = bitwiseVal
50+
}
51+
}
52+
i++
53+
}
54+
val queryLen = query.size
55+
val result = IntArray(queryLen)
56+
i = 0
57+
while (i < queryLen) {
58+
val start = query[i][0]
59+
val end = query[i][1]
60+
val parentStart = findParent(start, parent)
61+
val parentEnd = findParent(end, parent)
62+
if (start == end) {
63+
result[i] = 0
64+
} else if (parentStart == parentEnd) {
65+
result[i] = bitwise[parentStart]
66+
} else {
67+
result[i] = -1
68+
}
69+
i++
70+
}
71+
return result
72+
}
73+
74+
private fun findParent(node: Int, parent: IntArray): Int {
75+
var node = node
76+
while (parent[node] != node) {
77+
node = parent[node]
78+
}
79+
return node
80+
}
81+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
3108\. Minimum Cost Walk in Weighted Graph
2+
3+
Hard
4+
5+
There is an undirected weighted graph with `n` vertices labeled from `0` to `n - 1`.
6+
7+
You are given the integer `n` and an array `edges`, where <code>edges[i] = [u<sub>i</sub>, v<sub>i</sub>, w<sub>i</sub>]</code> indicates that there is an edge between vertices <code>u<sub>i</sub></code> and <code>v<sub>i</sub></code> with a weight of <code>w<sub>i</sub></code>.
8+
9+
A walk on a graph is a sequence of vertices and edges. The walk starts and ends with a vertex, and each edge connects the vertex that comes before it and the vertex that comes after it. It's important to note that a walk may visit the same edge or vertex more than once.
10+
11+
The **cost** of a walk starting at node `u` and ending at node `v` is defined as the bitwise `AND` of the weights of the edges traversed during the walk. In other words, if the sequence of edge weights encountered during the walk is <code>w<sub>0</sub>, w<sub>1</sub>, w<sub>2</sub>, ..., w<sub>k</sub></code>, then the cost is calculated as <code>w<sub>0</sub> & w<sub>1</sub> & w<sub>2</sub> & ... & w<sub>k</sub></code>, where `&` denotes the bitwise `AND` operator.
12+
13+
You are also given a 2D array `query`, where <code>query[i] = [s<sub>i</sub>, t<sub>i</sub>]</code>. For each query, you need to find the minimum cost of the walk starting at vertex <code>s<sub>i</sub></code> and ending at vertex <code>t<sub>i</sub></code>. If there exists no such walk, the answer is `-1`.
14+
15+
Return _the array_ `answer`_, where_ `answer[i]` _denotes the **minimum** cost of a walk for query_ `i`.
16+
17+
**Example 1:**
18+
19+
**Input:** n = 5, edges = [[0,1,7],[1,3,7],[1,2,1]], query = [[0,3],[3,4]]
20+
21+
**Output:** [1,-1]
22+
23+
**Explanation:**
24+
25+
![](https://assets.leetcode.com/uploads/2024/01/31/q4_example1-1.png)
26+
27+
To achieve the cost of 1 in the first query, we need to move on the following edges: `0->1` (weight 7), `1->2` (weight 1), `2->1` (weight 1), `1->3` (weight 7).
28+
29+
In the second query, there is no walk between nodes 3 and 4, so the answer is -1.
30+
31+
**Example 2:**
32+
33+
**Input:** n = 3, edges = [[0,2,7],[0,1,15],[1,2,6],[1,2,1]], query = [[1,2]]
34+
35+
**Output:** [0]
36+
37+
**Explanation:**
38+
39+
![](https://assets.leetcode.com/uploads/2024/01/31/q4_example2e.png)
40+
41+
To achieve the cost of 0 in the first query, we need to move on the following edges: `1->2` (weight 1), `2->1` (weight 6), `1->2` (weight 1).
42+
43+
**Constraints:**
44+
45+
* <code>2 <= n <= 10<sup>5</sup></code>
46+
* <code>0 <= edges.length <= 10<sup>5</sup></code>
47+
* `edges[i].length == 3`
48+
* <code>0 <= u<sub>i</sub>, v<sub>i</sub> <= n - 1</code>
49+
* <code>u<sub>i</sub> != v<sub>i</sub></code>
50+
* <code>0 <= w<sub>i</sub> <= 10<sup>5</sup></code>
51+
* <code>1 <= query.length <= 10<sup>5</sup></code>
52+
* `query[i].length == 2`
53+
* <code>0 <= s<sub>i</sub>, t<sub>i</sub> <= n - 1</code>
54+
* <code>s<sub>i</sub> != t<sub>i</sub></code>

0 commit comments

Comments
 (0)