Skip to content

Commit 9a8f8ba

Browse files
authored
Merge branch 'neetcode-gh:main' into main
2 parents fc077de + 31aca59 commit 9a8f8ba

7 files changed

+210
-13
lines changed

README.md

+5-5
Large diffs are not rendered by default.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
typedef unsigned long long ll;
2+
class Solution {
3+
public:
4+
bool solve(string & s , ll last , int index,int cnt){
5+
6+
if(index >= s.size()) return cnt > 1;
7+
8+
ll num = 0;
9+
bool ret = false;
10+
11+
for(int i = index ; i < s.size() ; i++){
12+
num = num * 10;
13+
num += (s[i] - '0');
14+
15+
if(last == -1 || last == num + 1){
16+
ret |= solve(s , num , i + 1 , cnt + 1);
17+
}else if(last != -1 && num >= last)break;
18+
}
19+
20+
return ret;
21+
}
22+
bool splitString(string s) {
23+
return solve(s,-1,0,0);
24+
}
25+
};

kotlin/0047-permutations-ii.kt

+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
class Solution {
2+
fun permuteUnique(nums: IntArray): List<List<Int>> {
3+
val count = HashMap<Int, Int>()
4+
val permut = LinkedList<Int>()
5+
val res = LinkedList<LinkedList<Int>>()
6+
7+
for (n in nums) count[n] = count.getOrDefault(n, 0) + 1
8+
9+
fun backtrack() {
10+
if (permut.size == nums.size) {
11+
res.add(LinkedList(permut))
12+
return
13+
}
14+
15+
for (n in count.keys) {
16+
if (count[n]!! > 0) {
17+
permut.addLast(n)
18+
count[n] = count[n]!! - 1
19+
20+
backtrack()
21+
22+
count[n] = count[n]!! + 1
23+
permut.removeLast()
24+
}
25+
}
26+
}
27+
28+
backtrack()
29+
return res
30+
}
31+
}
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,15 @@
11
class Solution {
22
fun lengthOfLIS(nums: IntArray): Int {
3-
val dp = IntArray(nums.size){1}
4-
for(i in nums.size-1 downTo 0){
5-
for(j in i+1 until nums.size){
6-
if(nums[i] < nums[j]){
3+
val dp = IntArray(nums.size) {1}
4+
5+
for (i in nums.size-1 downTo 0) {
6+
for (j in i + 1 until nums.size) {
7+
if (nums[i] < nums[j]) {
78
dp[i] = maxOf(dp[i], 1 + dp[j])
89
}
910
}
1011
}
11-
var max = 0
12-
for(n in dp)
13-
max = maxOf(max, n)
14-
return max
12+
13+
return dp.max()!!
1514
}
1615
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
/*
2+
* DFS + memoization solution
3+
*/
4+
class Solution {
5+
fun findNumberOfLIS(nums: IntArray): Int {
6+
val memo = HashMap<Int, Pair<Int, Int>>()
7+
var lisLen = 0
8+
var lisCount = 0
9+
10+
fun dfs(i: Int): Pair<Int, Int> {
11+
if (i in memo)
12+
return memo[i]!!
13+
14+
var maxLen = 1
15+
var maxCount = 1
16+
for (j in i+1 until nums.size) {
17+
if (nums[i] < nums[j]) {
18+
val (curLen, curCount) = dfs(j)
19+
if (curLen + 1 > maxLen) {
20+
maxLen = curLen + 1
21+
maxCount = curCount
22+
} else if (curLen + 1 == maxLen) {
23+
maxCount += curCount
24+
}
25+
}
26+
}
27+
28+
if (maxLen > lisLen) {
29+
lisLen = maxLen
30+
lisCount = maxCount
31+
} else if (maxLen == lisLen) {
32+
lisCount += maxCount
33+
}
34+
35+
memo[i] = (maxLen to maxCount)
36+
return memo[i]!!
37+
}
38+
39+
for (i in nums.indices)
40+
dfs(i)
41+
42+
return lisCount
43+
}
44+
}
45+
46+
/*
47+
* DP solution
48+
*/
49+
class Solution {
50+
fun findNumberOfLIS(nums: IntArray): Int {
51+
val lis = IntArray(nums.size) {1}
52+
val count = IntArray(nums.size)
53+
54+
var lisLen = 0
55+
var lisCount = 0
56+
for (i in nums.size-1 downTo 0) {
57+
var maxLen = 1
58+
var maxCount = 1
59+
60+
for (j in i+1 until nums.size) {
61+
if (nums[i] < nums[j]) {
62+
val curLen = lis[j]
63+
val curCount = count[j]
64+
if (curLen + 1 > maxLen) {
65+
maxLen = curLen + 1
66+
maxCount = curCount
67+
} else if (curLen + 1 == maxLen) {
68+
maxCount += curCount
69+
}
70+
}
71+
}
72+
73+
if (maxLen > lisLen) {
74+
lisLen = maxLen
75+
lisCount = maxCount
76+
} else if (maxLen == lisLen) {
77+
lisCount += maxCount
78+
}
79+
80+
lis[i] = maxLen
81+
count[i] = maxCount
82+
}
83+
84+
return lisCount
85+
}
86+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
class Solution {
2+
fun maxScore(cardPoints: IntArray, k: Int): Int {
3+
if (cardPoints.size == k) return cardPoints.sum()
4+
var l = cardPoints.size - k
5+
var r = cardPoints.lastIndex
6+
7+
var maxScore = 0
8+
var currentScore = 0
9+
// the sum of the initial sub-array
10+
for (i in l..r) {
11+
maxScore += cardPoints[i]
12+
currentScore += cardPoints[i]
13+
}
14+
15+
while (true) {
16+
currentScore -= cardPoints[l++ % cardPoints.size]
17+
currentScore += cardPoints[++r % cardPoints.size]
18+
maxScore = maxOf(maxScore, currentScore)
19+
if (l % cardPoints.size == 0) break
20+
}
21+
return maxScore
22+
}
23+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
class Solution {
2+
fun maxSumMinProduct(nums: IntArray): Int {
3+
val prefix = LongArray(nums.size + 1)
4+
val stack = ArrayDeque<Pair<Int, Long>>()
5+
val mod = 1000000007L
6+
7+
for (i in nums.indices) {
8+
prefix[i + 1] = prefix[i] + nums[i]
9+
}
10+
11+
var res = 0L
12+
for ((i, n) in nums.withIndex()) {
13+
var start = i
14+
15+
while (stack.isNotEmpty() && stack.peekLast().second > n) {
16+
val (lastStart, value) = stack.removeLast()
17+
val total = prefix[i] - prefix[lastStart]
18+
res = maxOf(res, total * value)
19+
start = lastStart
20+
}
21+
22+
stack.addLast(start to n.toLong())
23+
}
24+
25+
for ((start, value) in stack) {
26+
val total = prefix[nums.size] - prefix[start]
27+
res = maxOf(res, total * value)
28+
}
29+
30+
31+
return (res % mod).toInt()
32+
}
33+
}

0 commit comments

Comments
 (0)