题目一
454. 四数相加 II
给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) ,使得 A[i] + B[j] + C[k] + D[l] = 0。
为了使问题简单化,所有的 A, B, C, D 具有相同的长度 N,且 0 ≤ N ≤ 500 。所有整数的范围在 -228 到 228 - 1 之间,最终结果不会超过 231 - 1 。
例如:
输入:
A = [ 1, 2]
B = [-2,-1]
C = [-1, 2]
D = [ 0, 2]
输出:
2
解释:
两个元组如下:
- (0, 0, 0, 1) -> A[0] + B[0] + C[0] + D[1] = 1 + (-2) + (-1) + 2 = 0
- (1, 1, 0, 0) -> A[1] + B[1] + C[0] + D[0] = 2 + (-1) + (-1) + 0 = 0
我没做出来
官方答案:分组 + 哈希表
class Solution {
public int fourSumCount(int[] A, int[] B, int[] C, int[] D) {
int n = 0;
// 二重循环,先加前两个数组的值
Map<Integer, Integer> ABmap = new HashMap<>();
for(int a : A){
for(int b: B){
ABmap.put(a+b, ABmap.getOrDefault(a+b, 0)+1); // 第一次没有值就为default的值0
}
}
for(int c : C){
for(int d : D){
if(ABmap.containsKey(-(c+d))){
// 如果负的c+d有值,说明可以与a+b相加为0
n += ABmap.get(-(c+d)); // 加上已有的值
}
}
}
return n;
}
}
复杂度分析
时间复杂度:O(n^2)。我们使用了两次二重循环,时间复杂度均为 O(n^2)。在循环中对哈希映射进行的修改以及查询操作的期望时间复杂度均为 O(1),因此总时间复杂度为 O(n^2)。
空间复杂度:O(n^2),即为哈希映射需要使用的空间。在最坏的情况下,A[i]+B[j]A[i]+B[j] 的值均不相同,因此值的个数为 n^2 ,也就需要 O(n^2)的空间。
题目二
1290. 二进制链表转整数
给你一个单链表的引用结点 head。链表中每个结点的值不是 0 就是 1。已知此链表是一个整数数字的二进制表示形式。
请你返回该链表所表示数字的 十进制值 。
示例 1:
输入:head = [1,0,1]
输出:5
解释:二进制数 (101) 转化为十进制数 (5)
示例 2:
输入:head = [0]
输出:0
示例 3:
输入:head = [1]
输出:1
示例 4:
输入:head = [1,0,0,1,0,0,1,1,1,0,0,0,0,0,0]
输出:18880
示例 5:
输入:head = [0,0]
输出:0
提示:
链表不为空。
链表的结点总数不超过 30。
每个结点的值不是 0 就是 1。
我的答案
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public int getDecimalValue(ListNode head) {
if (head == null) return 0;
StringBuilder str = new StringBuilder();
while(head != null){
str.append(head.val);
head = head.next;
}
return Integer.parseInt(str.toString(), 2); // 二进制转十进制
}
}