因为个人原因,开始Leetcode刷题之路,第一个小目标,先把Hot 100刷完一轮。(先立个flag,希望不要变成戏台上的老将军) 主要涉及Java和c++,和github仓库里的leetcode_note侧重点不太一样。
0x01 两数之和 vector:详见Manual,注意c++中vector的引用格式
BruteForce 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 class Solution { public int [] twoSum(int [] nums, int target) { int [] res = new int [2 ]; for (int i = 0 ; i < nums.length; i++) { for (int j = i + 1 ; j < nums.length; j++) { if (nums[i] + nums[j] == target){ res[0 ] = i; res[1 ] = j; break ; } } } return res; } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 class Solution {public : vector <int > twoSum (vector <int >& nums, int target) { vector <int > res (2 ) ; for (int i = 0 ; i < nums.size(); i++) { for (int j = i + 1 ; j < nums.size(); j++) { if (nums[i] + nums[j] == target) { res[0 ] = i; res[1 ] = j; } } } return res; } };
HashTable HashMap:详见Manual
注意问题转换,碎碎念版本在Github 。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 class Solution { public int [] twoSum(int [] nums, int target) { Map<Integer, Integer> map = new HashMap<Integer, Integer>(); for (int i = 0 ; i < nums.length; i++) { if (map.containsKey(target - nums[i])) { return new int []{map.get(target - nums[i]), i}; } map.put(nums[i],i); } return new int [0 ]; } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 class Solution { vector <int > twoSum (vector <int >& nums, int target) { map <int , int > hashtable; for (int i = 0 ; i < nums.size(); ++i) { if (hashtable.find(target - nums[i])) { } hashtable. } } };
0x02 两数相加 Java空指针 - nullptr
是一个模拟,不难但需要注意细节。
进位flag记录之后要刷新val和flag的值
循环终止条件是两个链表都空
单链表空时,其值记为0
最后一个数字要判断是否有进位
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 48 49 class Solution { public ListNode addTwoNumbers (ListNode l1, ListNode l2) { boolean flag = false ; ListNode first = new ListNode(0 ); ListNode node = first; int v1 = 0 ; int v2 = 0 ; while (l1 || l2) { v1 = l1 ? l1.val : 0 ; v2 = l2 ? l2.val : 0 ; if (l1) { l1 = l1.next; } if (l2) { l2 = l2.next; } node.val = flag ? (v1 + v2 + 1 ) : (v1 + v2); flag = false ; if (node.val >= 10 ) { flag = true ; node.val %= 10 ; } if (l1 || l2) { ListNode next = new ListNode(); node.next = next; node = next; } } if (flag) { ListNode next = new ListNode(1 ); node.next = next; } return first; } }
链表c++我不熟,晚点补
0x03 无重复字符最长子串 0x04 寻找两个正序数组的中位数