Skip to content

Commit 015ee96

Browse files
Merge pull request #149
add new problem 13.02
2 parents f09b7c4 + 4aeb452 commit 015ee96

File tree

8 files changed

+341
-5
lines changed

8 files changed

+341
-5
lines changed

.idea/other.xml

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package com.github.contest
22

3-
4-
import com.github.contest.dp.divisorGameDp
3+
import com.github.contest.heap.halveArray
54

65

76
/**
@@ -10,6 +9,7 @@ import com.github.contest.dp.divisorGameDp
109

1110
fun main() {
1211

13-
divisorGameDp(6)
12+
halveArray(intArrayOf(7, 7, 7, 31, 2)).also { println(it) }
13+
1414

1515
}

contest/src/main/java/com/github/contest/dp/DpLeetcode.kt

Lines changed: 114 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -197,16 +197,128 @@ fun longestIdealString(s: String, k: Int): Int {
197197
fun divisorGameDp(n: Int): Boolean {
198198
if (n <= 1) return false
199199
val dp = BooleanArray(n + 1)
200-
dp[1] = false // Base case: If n is 1, the current player loses
200+
dp[1] = false
201201

202202
for (i in 2..n) {
203203
for (x in 1 until i) {
204204
if (i % x == 0 && !dp[i - x]) {
205205
dp[i] = true
206-
break // If we find a winning move, we can stop checking
206+
break
207207
}
208208
}
209209
}
210210

211211
return dp[n]
212+
}
213+
214+
/**
215+
* 2900. Longest Unequal Adjacent Groups Subsequence I
216+
*/
217+
218+
fun getLongestSubsequence(words: Array<String>, groups: IntArray): List<String> {
219+
val dp = BooleanArray(words.size) { false }
220+
dp[0] = true
221+
var j = 0
222+
for (i in 1 until groups.size) {
223+
if (groups[i] != groups[j]) {
224+
dp[i] = true
225+
j = i
226+
}
227+
}
228+
var res = mutableListOf<String>()
229+
for (i in words.indices) {
230+
if (dp[i]) res.add(words[i])
231+
}
232+
233+
return res
234+
}
235+
236+
/**
237+
* 64. Minimum Path Sum
238+
*/
239+
240+
fun minPathSum(grid: Array<IntArray>): Int {
241+
val m = grid.size
242+
val n = grid[0].size
243+
val dp = Array(m) { IntArray(n) }
244+
245+
246+
dp[0][0] = grid[0][0]
247+
248+
249+
for (j in 1 until n) {
250+
dp[0][j] = dp[0][j - 1] + grid[0][j]
251+
}
252+
253+
254+
for (i in 1 until m) {
255+
dp[i][0] = dp[i - 1][0] + grid[i][0]
256+
}
257+
258+
259+
for (i in 1 until m) {
260+
for (j in 1 until n) {
261+
dp[i][j] = minOf(dp[i - 1][j], dp[i][j - 1]) + grid[i][j]
262+
}
263+
}
264+
265+
return dp[m - 1][n - 1]
266+
}
267+
268+
/**
269+
* 1981. Minimize the Difference Between Target and Chosen Elements
270+
*/
271+
272+
fun minimizeTheDifference(mat: Array<IntArray>, target: Int): Int {
273+
val m = mat.size
274+
val n = mat[0].size
275+
276+
var possibleSums = mutableSetOf<Int>()
277+
for (num in mat[0]) {
278+
possibleSums.add(num)
279+
}
280+
281+
for (i in 1 until m) {
282+
val nextPossibleSums = mutableSetOf<Int>()
283+
for (sum in possibleSums) {
284+
for (num in mat[i]) {
285+
nextPossibleSums.add(sum + num)
286+
}
287+
}
288+
possibleSums = nextPossibleSums
289+
}
290+
291+
var minDiff = Int.MAX_VALUE
292+
for (sum in possibleSums) {
293+
minDiff = minOf(minDiff, abs(sum - target))
294+
}
295+
296+
return minDiff
297+
}
298+
299+
/**
300+
* 2063. Vowels of All Substrings
301+
*/
302+
303+
fun countVowels(word: String): Long {
304+
val n = word.length
305+
val dp = LongArray(n)
306+
val vowels = setOf('a', 'e', 'i', 'o', 'u')
307+
var totalVowels = 0L
308+
309+
if (word[0] in vowels) {
310+
dp[0] = 1
311+
}
312+
313+
totalVowels += dp[0]
314+
315+
for (i in 1 until n) {
316+
dp[i] = dp[i - 1]
317+
if (word[i] in vowels) {
318+
dp[i] += (i + 1).toLong()
319+
}
320+
totalVowels += dp[i]
321+
}
322+
323+
return totalVowels
212324
}

contest/src/main/java/com/github/contest/hashTable/HashTableAlternativeSolution.kt

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,30 @@ fun areAlmostEqualAltSolution(s1: String, s2: String): Boolean {
1919
s1[diff[0]] == s2[diff[1]] && s2[diff[0]] == s1[diff[1]] -> true
2020
else -> false
2121
}
22+
}
23+
24+
/**
25+
*
26+
*/
27+
28+
fun countBadPairsAltSolution(nums: IntArray): Long {
29+
val allPairs = nums.size.toLong() * (nums.size - 1)
30+
val allOrderedPairs = allPairs / 2
31+
32+
val map = HashMap<Int, Counter>()
33+
nums.forEachIndexed { i, value ->
34+
map.getOrPut(value - i) { Counter() }.count++
35+
}
36+
37+
var goodOrderedPairs = 0L
38+
for (c in map.values) {
39+
val goodPairs = c.count.toLong() * (c.count - 1)
40+
goodOrderedPairs += goodPairs / 2
41+
}
42+
43+
return allOrderedPairs - goodOrderedPairs
44+
}
45+
46+
class Counter {
47+
var count: Int = 0
2248
}

contest/src/main/java/com/github/contest/hashTable/HashTableLeetcode.kt

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,4 +147,84 @@ private fun String.hasSingle(): Boolean = when {
147147

148148
private fun isDigit(s: Char): Boolean {
149149
return s in "0123456789"
150+
}
151+
152+
/**
153+
* 2364. Count Number of Bad Pairs
154+
*/
155+
156+
157+
fun countBadPairs(nums: IntArray): Long {
158+
val n = nums.size
159+
val diffCounts = mutableMapOf<Int, Long>()
160+
var goodPairs = 0L
161+
162+
for (j in 0 until n) {
163+
val diff = nums[j] - j
164+
goodPairs += diffCounts.getOrDefault(diff, 0L)
165+
diffCounts[diff] = diffCounts.getOrDefault(diff, 0L) + 1
166+
}
167+
168+
val totalPairs = n.toLong() * (n - 1) / 2
169+
return totalPairs - goodPairs
170+
}
171+
172+
/**
173+
*
174+
*/
175+
176+
fun findPairs(nums: IntArray, k: Int): Int {
177+
if (k < 0) return 0
178+
179+
val numCounts = mutableMapOf<Int, Int>()
180+
for (num in nums) {
181+
numCounts[num] = numCounts.getOrDefault(num, 0) + 1
182+
}
183+
184+
if (k == 0) {
185+
return numCounts.count { it.value >= 2 }
186+
}
187+
188+
val uniquePairs = mutableSetOf<Pair<Int, Int>>()
189+
for (num in nums) {
190+
if (numCounts.containsKey(num + k)) {
191+
uniquePairs.add(Pair(minOf(num, num + k), maxOf(num, num + k)))
192+
}
193+
}
194+
195+
return uniquePairs.size
196+
}
197+
198+
/**
199+
* 2342. Max Sum of a Pair With Equal Sum of Digits
200+
*/
201+
202+
fun maximumSum(nums: IntArray): Int {
203+
var maxSum = -1
204+
val map = mutableMapOf<Int, Int>()
205+
206+
for (i in 0 until nums.size) {
207+
val sum = sumOfDigit(nums[i])
208+
if (map.contains(sum)) {
209+
val first = map.getOrDefault(sum, -1)
210+
maxSum = maxOf(maxSum, nums[first] + nums[i])
211+
map[sum] = when {
212+
nums[i] > nums[first] -> i
213+
else -> first
214+
}
215+
} else map[sum] = map.getOrDefault(sum, i)
216+
}
217+
218+
return maxSum
219+
}
220+
221+
private fun sumOfDigit(num: Int): Int {
222+
var num = num
223+
var res = 0
224+
while (num != 0) {
225+
res += num % 10
226+
num /= 10
227+
}
228+
229+
return res
150230
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,48 @@
11
package com.github.contest.heap
22

3+
import java.util.PriorityQueue
4+
5+
/**
6+
* 3066. Minimum Operations to Exceed Threshold Value II
7+
*/
8+
9+
fun minOperations(nums: IntArray, k: Int): Int {
10+
var operation = 0
11+
val pq = PriorityQueue<Long>()
12+
for (num in nums) pq.offer(num.toLong())
13+
14+
while (pq.size > 1 && pq.peek() < k) {
15+
val x = pq.poll()
16+
val y = pq.poll()
17+
val new = minOf(x, y) * 2 + maxOf(x, y)
18+
pq.offer(new)
19+
operation++
20+
}
21+
22+
return operation
23+
}
24+
25+
/**
26+
* 2208. Minimum Operations to Halve Array Sum
27+
*/
28+
29+
fun halveArray(nums: IntArray): Int {
30+
val pq = PriorityQueue<Double>(reverseOrder())
31+
var sum = 0.0
32+
for (num in nums) {
33+
pq.offer(num.toDouble())
34+
sum += num
35+
}
36+
37+
var operations = 0
38+
var halvedSum = 0.0
39+
while (halvedSum < (sum / 2)) {
40+
val largest = pq.poll()
41+
val halved = largest / 2
42+
halvedSum += halved
43+
pq.offer(halved)
44+
operations++
45+
}
46+
47+
return operations
48+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package com.github.contest.stack
2+
3+
/**
4+
* 3174. Clear Digits
5+
*/
6+
7+
fun clearDigits(s: String): String {
8+
val stack = ArrayDeque<Char>()
9+
for (char in s) {
10+
if (isDigit(char)) {
11+
if (stack.isNotEmpty()) stack.removeLast()
12+
} else stack.addLast(char)
13+
}
14+
return if (stack.isEmpty()) "" else buildString {
15+
while (stack.isNotEmpty()) {
16+
val temp = stack.removeFirst()
17+
append(temp)
18+
}
19+
}
20+
}
21+
22+
private fun isDigit(char: Char) = char in "0123456789"
23+
24+
25+
/**
26+
* 1910. Remove All Occurrences of a Substring
27+
*/
28+
29+
fun removeOccurrences(s: String, part: String): String {
30+
val res = StringBuilder()
31+
val m = part.length
32+
33+
for (c in s.toCharArray()) {
34+
res.append(c)
35+
if (res.length >= m && res.substring(res.length - m) == part) {
36+
res.delete(res.length - m, res.length)
37+
}
38+
}
39+
return res.toString()
40+
}
41+
42+

0 commit comments

Comments
 (0)