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; } }
|