LeetCode热题100道-Day01
1. 两数之和
- 先创建哈希表把数组拷贝到表中,Key存元素值,Value存元素下标,循环遍历nums,在哈希表中寻找target - nums[i]的Key值,存在并且两数的Value不同,存入数组res并返回。
class Solution {
public int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<>();
int[] res = new int[2];
for (int i = 0; i < nums.length; i++)
map.put(nums[i], i);
for (int i = 0; i < nums.length; i++) {
int num = target - nums[i];
if (map.containsKey(num)) {
if (i != map.get(num)) {
res[0] = i;
res[1] = map.get(num);
}
}
}
return res;
}
}
2. 两数相加
- 定义一个虚拟的头节点dummp,p指针指向头节点定义一个进位值count,当p1不等于null或p2不等于null时进入循环,将两者节点值相加并加上count赋给sum,下一节点的count为sum / 10,p指针的下一节点值为sum mod 10,将新链表的节点后移,当p1不等于null时,p1的节点后移,p2相同,再进行下一次循环。如果count不为0,则count赋给链表的新节点。
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode dummy = new ListNode(-1), p = dummy;
ListNode p1 = l1, p2 = l2;
int count = 0;
while (p1 != null || p2 != null) {
int n1 = p1 != null ? p1.val : 0;
int n2 = p2 != null ? p2.val : 0;
int sum = n1 + n2 + count;
count = sum / 10;
sum %= 10;
p.next = new ListNode(sum);
p = p.next;
if (p1 != null) p1 = p1.next;
if (p2 != null) p2 = p2.next;
}
if (count != 0) {
p.next = new ListNode(count);
}
return dummy.next;
}
}
3. 无重复字符的最长子串
- 定义一个HashMap存储字符和坐标,定义max、start和end指针,让start和end都指向第一个字符。对字符串进行遍历,如果end所指向字符不存在map中,则把字符存入map,更新max,如果存在map中,则改变start为map中与end指向的那个相等字符的下标+1。
class Solution {
public int lengthOfLongestSubstring(String s) {
if (s.length() <= 1) {
return s.length();
}
int max = 0;
Map<Character, Integer> map = new HashMap<>();
for (int start = 0, end = 0; end < s.length(); end++) {
char ch = s.charAt(end);
if (map.containsKey(ch)) {
start = Math.max(map.get(ch) + 1, start);
}
max = Math.max(end - start + 1, max);
map.put(ch, end);
}
return max;
}
}