1. 两数之和 - 力扣(LeetCode)

朴素解法 由于我们每次要从数组中找两个数。 因此一个很简单的思路是:使用两重循环枚举下标 i 和 j ,分别代表要找的两个数。 然后判断 nums[i] + nums[j] == target 是否成立。 另外为了防止得到重复的解,我们需要在第一层循环中让 i 从 0 开始,到 n - 2 结束(确保能取 到下一位数作为 j );在第二层循环中让 j 从 i + 1 开始,到 n - 1 结束。

1
2
3
4
5
6
7
8
9
10
11
class Solution {
public int[] twoSum(int[] nums,int t){
int n = nums.length;
for(int i = 0;i<n-1;i++){
for(int j = i+1;j<n;j++){
if(t==nums[i]+nums[j])return new int[]{i,j};
}
}
return new int[]{};
}
}

时间复杂度O($n^2$)

哈希表

1
2
3
4
5
6
7
8
9
10
11
class Solution {
public int[] twoSum(int[] nums,int t){
Map<Integer,Integer>map = new HashMap<>();
for(int i = 0;i<nums.length;i++){
int a = nums[i],b = t-a;
if(map.containsKey(b))return new int[]{map.get(b),i};
map.put(a,i);
}
return new int[]{};
}
}

2. 两数相加 - 力扣(LeetCode)

朴素解法(哨兵技巧) 这是道模拟题,模拟人工竖式做加法的过程: 从最低位至最高位,逐位相加,如果和大于等于 10,则保留个位数字,同时向前一位进 1 如果 最高位有进位,则需在最前面补 1。 做有关链表的题目,有个常用技巧:添加一个虚拟头结点(哨兵),帮助简化边界情况的判断。 代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Solution {
public ListNode addTwoNumbers(ListNode l1,ListNode l2){
ListNode dummy = new ListNode(0);//哨兵
ListNode tmp = dummy;
int t = 0;
while(l1!=null || l2!=null){
int a = l1!=null ? l1.val : 0;
int b = l2!=null ? l2.val : 0;
t = a + b + t;
tmp.next = new ListNode(t % 10);
t/=10;
if(l1!=null)l1=l1.next;
if(l2!=null)l2=l2.next;
}
if(t>0) tmp.next = new ListNode(t);
return dummy.next;
}
}