lcp333

合并两个二维数组 - 求和法

方法二:归并排序

注意边界条件是i == m, j == n

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class Solution {
public int[][] mergeArrays(int[][] nums1, int[][] nums2) {
List<int[]> list = new ArrayList<>();
int i = 0, j = 0, m = nums1.length, n = nums2.length;
while (true) {
if (i == m) {
while (j < n)
list.add(nums2[j++]);
break;
}
if (j == n) {
while (i < m)
list.add(nums1[i++]);
break;
}
if (nums1[i][0] < nums2[j][0])
list.add(nums1[i++]);
else if (nums1[i][0] > nums2[j][0])
list.add(nums2[j++]);
else {
nums1[i][1] += nums2[j++][1];
list.add(nums1[i++]);
}
}
return list.toArray(new int[list.size()][]);
}
}

方法一:TreeMap

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution {
public int[][] mergeArrays(int[][] nums1, int[][] nums2) {
TreeMap<Integer, Integer> map = new TreeMap<>();
for (int[] arr : nums1)
map.put(arr[0], map.getOrDefault(arr[0], 0) + arr[1]);
for (int[] arr : nums2)
map.put(arr[0], map.getOrDefault(arr[0], 0) + arr[1]);
int[][] res = new int[map.size()][2];
int index = 0;
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
res[index][0] = entry.getKey();
res[index++][1] = entry.getValue();
}
return res;
}
}

将整数减少到零需要的最少操作数

方法二:记忆化搜索

考虑将每个lowerbit +1或者-1操作,取最小值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution {
public int minOperations(int num) {
dp = new int[Integer.toBinaryString(num).length()];
return dfs(num);
}

private int dfs(int num) {
if (Integer.bitCount(num) == 0)
return 0;
int lowerbit = num & -num;
return Math.min(dfs(num + lowerbit), dfs(num - lowerbit)) + 1;
}

int[] dp;
}

base case 可以换成以下形式,如果num & (num - 1)) == 0,那么num是2的幂次,等价于Integer.bitCount(num) == 1

1
2
if ((num & (num - 1)) == 0)
return 1;

方法一:贪心

从前往后遍历(遍历顺序无所谓),将连续的1分段加入treemap中,

  • 如果一段后一段第一个元素与前一段最后一个元素的下标差为2(前一个1与后一个1中间只隔了1个0),先++res
    • 如果前一段只有一个元素,不与下一段合并
    • 否则,与下一段合并,把flag置为true
  • 如果一段后一段第一个元素与前一段最后一个元素的下标差>2
    • 如果第一段只有一个元素,并且前一段不和当前第一段合并,那么++res
    • 否则,上一段是需要和这一段合并的,res+=2(将最低位+1,比如111 -> 1000,再将这个1减去,两次操作),并将flag还原为false

最开始 s = s + "000";是为了最后遍历的时候,不用再考虑最后一段

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
class Solution {
public int minOperations(int num) {
if (num == 1)
return 1;
String s = Integer.toBinaryString(num);
s = s + "000";
int res = 0, n = s.length();

TreeMap<Integer, Integer> map = new TreeMap<>();
int preIndex = 0;
for (int i = 0; i < n - 1; ++i) {
char ch1 = s.charAt(i), ch2 = s.charAt(i + 1);
if (ch1 == '1' && preIndex == i)
map.put(i, i);
if (ch1 == '1' && ch2 == '1') {
map.put(preIndex, i + 1);
} else if (ch1 == '0') {
preIndex = i + 1;
}
}
int[][] arr = new int[map.size() + 1][2];
int index = 0;
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
arr[index][0] = entry.getKey();
arr[index++][1] = entry.getValue();
}
int i;
boolean flag = false;
for (i = 0; i < arr.length - 1; ++i) {
int[] a = arr[i], b = arr[i + 1];
int len1 = a[1] - a[0];
if (b[0] - a[1] == 2) {
++res;
if (len1 > 0)
flag = true;
} else {
if (len1 == 0 && !flag)
++res;
else {
res += 2;
flag = false;
}
}
}
return res;
}
}

无平方子集计数

找出对应 LCP 矩阵的字符串

方法一:

1


lcp333
https://leopol1d.github.io/2023/08/25/lcp333/
作者
Leopold
发布于
2023年8月25日
许可协议