1. 两数之和
Difficulty: 简单
给定一个整数数组 nums
和一个目标值 target
,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
解题关键点 :HashMap、先找后存
Solution
Language: Java
//HashMap 边存边找
import java.util.HashMap;
class Solution {
public int[] twoSum(int[] nums, int target) {
HashMap<Integer, Integer> map = new HashMap<>();
int[] res = new int[2];
for(int i=0; i<nums.length; i++){
if(map.containsKey(target-nums[i])){
res[0] = map.get(target-nums[i]);
res[1] = i;
return res;
}
map.put(nums[i],i);
}
return res;
}
}
2. 两数相加
Difficulty: 中等
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
解题关键点 :按位加,注意进位
Solution
Language: Java
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
int sum=0, temp=0, x1, x2;
ListNode head = null, t = null;
while(l1!=null || l2!=null || temp!=0){
if(l1==null && l2==null){
sum = temp%10;
temp = temp/10;
}
else if(l1 == null){
sum = (l2.val+temp)%10;
temp = (l2.val+temp)/10;
l2 = l2.next;
}
else if(l2 == null){
sum = (l1.val+temp)%10;
temp = (l1.val+temp)/10;
l1 = l1.next;
}
else{
sum = (l1.val+l2.val+temp)%10;
temp = (l1.val+l2.val+temp)/10;
l1 = l1.next;
l2 = l2.next;
}
ListNode n = new ListNode(sum);
if(head == null){
head = n;
t = head;
}
else{
t.next = n;
t = t.next;
}
}
return head;
}
}
3. 无重复字符的最长子串
Difficulty: 中等
给定一个字符串,请你找出其中不含有重复字符的 **最长子串 **的长度。
示例 1:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
解题关键点 :ArrayList存储无重复的子串
Solution
Language: Java
class Solution {
public int lengthOfLongestSubstring(String s) {
if(s==null || s.length()<=0) return 0;
int max = 0, count = 0, len = s.length();
ArrayList<Character> list = new ArrayList<>();
for(int i=0; i<len; i++){
char c = s.charAt(i);
int index = list.indexOf(c);
if(index == -1){
list.add(c);
count++;
}
else{
for(int j=0; j<=index; j++){
list.remove(0);
}
list.add(c);
max = max>count? max: count;
count = list.size();
}
}
max = max>count? max: count;
return max;
}
}
4. 寻找两个正序数组的中位数
Difficulty: 困难
给定两个大小为 m 和 n 的正序(从小到大)数组 nums1
和 nums2
。
请你找出这两个正序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。
你可以假设 nums1
和 nums2
不会同时为空。
示例 1:
nums1 = [1, 3]
nums2 = [2]
则中位数是 2.0
示例 2:
nums1 = [1, 2]
nums2 = [3, 4]
则中位数是 (2 + 3)/2 = 2.5
题目要求的复杂度,我还没想出来。。。。。
Solution
Language: Java
5. 最长回文子串
Difficulty: 中等
给定一个字符串 s
,找到 s
中最长的回文子串。你可以假设 s
的最大长度为 1000。
示例 1:
输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
示例 2:
输入: "cbbd"
输出: "bb"
解题关键点:中心拓展法
Solution
Language: Java
//中心拓展法
//第一种回文:baab
//第二种回文:bab
class Solution {
public String longestPalindrome(String s) {
String res = "";
int count = 0, len = s.length(), low,high;
for(int i=0; i<len; i++){
int temp = 0;
//如果是第一种回文
if(i<len-1 && s.charAt(i)==s.charAt(i+1)){
low = i;
high = i+1;
while(low>=0 && high<=len-1 && s.charAt(low)==s.charAt(high)){
temp += 2;
low--;
high++;
}
if(count < temp){
res = s.substring(low+1, high);
count = temp;
}
}
//不管是否是第一种回文,都要去判断是否满足第二种回文
low = i-1;
high = i+1;
temp = 1;
while(low>=0 && high<=len-1 && s.charAt(low)==s.charAt(high)){
temp += 2;
low--;
high++;
}
if(count < temp){
res = s.substring(low+1, high);
count = temp;
}
}
return res;
}
}