classSolution{public int[]twoSum(int[] nums, int target){for(int i =0; i < nums.length -1; i++){for(int j = i +1; j < nums.length; j++){if(nums[j]== target - nums[i]){returnnewint[]{i, j};}}}returnnull;}}
2.两数相加
classSolution{public ListNode addTwoNumbers(ListNode l1, ListNode l2){
int sum =0, carry =0;
ListNode head =null, tail =null;while(l1 !=null|| l2 !=null){
int n1 = l1 ==null?0: l1.val;
int n2 = l2 ==null?0: l2.val;
sum = n1 + n2 + carry;if(head ==null){
head =newListNode(sum %10);
tail = head;}else{
tail.next =newListNode(sum %10);
tail = tail.next;}
carry = sum /10;if(l1 !=null) l1 = l1.next;if(l2 !=null) l2 = l2.next;if(carry >0){
tail.next =newListNode(carry);}}return head;}}
3.无重复字符的最长子串
classSolution{public int lengthOfLongestSubstring(String s){
HashMap<Character, Integer> map =newHashMap<>();
char[] chars = s.toCharArray();
int begin =0, end =0;
int maxLen =0;while(end < chars.length){if(map.containsKey(chars[end])&& map.get(chars[end])>= begin){
begin = map.get(chars[end])+1;}
map.put(chars[end], end);
end++;
maxLen = Math.max(end - begin, maxLen);}return maxLen;}}
4.寻找两个正序数组的中位数
classSolution{public double findMedianSortedArrays(int[] nums1, int[] nums2){
List<Integer> list =newArrayList<>();
int size =0;
double result =0;for(int num : nums1){
list.add(num);}for(int num : nums2){
list.add(num);}
list.sort(Comparator.naturalOrder());
size = list.size();
result = size %2==0?(list.get(size /2)+ list.get(size /2-1))/2.0: list.get(size /2);return result;}}
5.最长回文子串
classSolution{public String longestPalindrome(String s){if(s.length()<2){return s;}
int max =1, begin =0;
boolean dp[][]=newboolean[s.length()][s.length()];
char[] chars = s.toCharArray();for(int i =0; i < s.length(); i++){
dp[i][i]=true;}for(int right =1; right < chars.length; right++){for(int left =0; left < right; left++){if(chars[left]!= chars[right]){
dp[left][right]=false;}else{//相等if(right - left <3){
dp[left][right]=true;}else{
dp[left][right]= dp[left +1][right -1];}}if(dp[left][right]&& max <(right - left +1)){
max = right - left +1;
begin = left;}}}return s.substring(begin, begin + max);}}
11.盛最多水的容器
classSolution{public int maxArea(int[] height){
int left =0, right = height.length -1, result =0;while(left < right){
int h = Math.min(height[left], height[right]);
int area = h *(right - left);
result = Math.max(result, area);if(height[left]> height[right]){
right--;}else{
left++;}}return result;}}
17.电话号码的字母组合
classSolution{
List<String> res =newArrayList<>();
HashMap<Integer, String> map =newHashMap<>();public List<String>letterCombinations(String digits){
map.put(1,"");
map.put(2,"abc");
map.put(3,"def");
map.put(4,"ghi");
map.put(5,"jkl");
map.put(6,"mno");
map.put(7,"pqrs");
map.put(8,"tuv");
map.put(9,"wxyz");if(digits ==null|| digits.length()==0){returnnewArrayList<>();}iterStr(digits,newStringBuilder(),0);return res;}privatevoiditerStr(String digits, StringBuilder stringBuilder, int index){if(index == digits.length()){
res.add(stringBuilder.toString());return;}
int pos = Integer.parseInt(String.valueOf(digits.charAt(index)));
String temp = map.get(pos);for(int i =0; i < temp.length(); i++){
stringBuilder.append(temp.charAt(i));iterStr(digits, stringBuilder, index +1);
stringBuilder.deleteCharAt(stringBuilder.length()-1);}}}
19.删除链表的倒数第 N 个结点
classSolution{public ListNode removeNthFromEnd(ListNode head, int n){
ListNode pre =newListNode(0);
pre.next = head;
ListNode forward = pre, back = pre;for(int i =0; i < n; i++){
forward = forward.next;}while(forward.next !=null){
forward = forward.next;
back = back.next;}
back.next = back.next.next;return pre.next;}}
20.有效的括号
classSolution{public boolean isValid(String s){if(s.isEmpty())returntrue;
Stack<Character> stack =newStack<>();for(char c : s.toCharArray()){if(c =='('){
stack.push(')');}elseif(c =='{'){
stack.push('}');}elseif(c =='['){
stack.push(']');}elseif(stack.isEmpty()|| c != stack.pop()){returnfalse;}}return stack.isEmpty();}}
classSolution{
List<String> res =newArrayList<>();public List<String>generateParenthesis(int n){if(n ==0)returnnewArrayList<>();
StringBuilder stringBuilder =newStringBuilder();
stringBuilder.append("(");produce(n -1, stringBuilder, n);return res;}privatevoidproduce(int left, StringBuilder stringBuilder, int right){if(left ==0&& right ==0){
res.add(stringBuilder.toString());return;}if(left <0|| right <0){return;}if(left > right){return;}if(left>0){
stringBuilder.append("(");produce(left-1,stringBuilder,right);
stringBuilder.deleteCharAt(stringBuilder.length()-1);}if(right>0){
stringBuilder.append(")");produce(left,stringBuilder,right-1);
stringBuilder.deleteCharAt(stringBuilder.length()-1);}}}
31.下一个排列
classSolution{publicvoidnextPermutation(int[] nums){
int index = nums.length -1;while(index -1>=0&& nums[index]<= nums[index -1]){
index--;}if(index ==0){reverse(nums, index);}else{
int temp = index;while(temp < nums.length -1&& nums[temp +1]> nums[index -1]){
temp++;}swap(nums, temp, index -1);reverse(nums, index);}}privatevoidreverse(int[] nums, int index){
int i = index, j = nums.length -1;while(i < j){swap(nums, i++, j--);}}privatevoidswap(int[] nums, int i, int j){
int temp = nums[i];
nums[i]= nums[j];
nums[j]= temp;}}
33.搜索旋转排序数组
classSolution{public int search(int[] nums, int target){if(nums==null||nums.length ==0)return-1;if(nums.length ==1)return nums[0]== target ?0:-1;
int left =0, right = nums.length -1;while(left <= right){
int mid =(left + right)/2;if(nums[mid]== target)return mid;if(target >= nums[0]){//target在左端 4567xxxif(nums[mid]< nums[0]){
nums[mid]= Integer.MAX_VALUE;}}else{//target在右端 xxxx123if(nums[mid]>= nums[0]){
nums[mid]= Integer.MIN_VALUE;}}if(nums[mid]< target){
left = mid +1;}else{
right = mid -1;}}return-1;}}
34.在排序数组中查找元素的第一个和最后一个位置
classSolution{public int[]searchRange(int[] nums, int target){if(nums.length ==0){returnnewint[]{-1,-1};}
int left =0, right = nums.length -1;while(left < right){
int mid =(left + right)/2;if(nums[mid]>= target){
right = mid;}else{
left = mid +1;}}if(nums[left]!= target){returnnewint[]{-1,-1};}
int l = left;
right = nums.length -1;while(left < right){
int mid =(left + right +1)/2;if(nums[mid]<= target){
left = mid;}else{
right = mid -1;}}returnnewint[]{l, right};}}
39.组合总和
classSolution{public List<List<Integer>>combinationSum(int[] candidates, int target){
List<List<Integer>> res =newArrayList<>();
Arrays.sort(candidates);backtrack(candidates, target, res,newArrayList<Integer>(),0,0);return res;}privatevoidbacktrack(int[] candidates, int target, List<List<Integer>> res, ArrayList<Integer> temp, int begin, int sum){if(sum == target){
res.add(newArrayList<>(temp));return;}for(int i = begin; i < candidates.length; i++){if(sum + candidates[i]<= target){
temp.add(candidates[i]);backtrack(candidates, target, res, temp, i, sum + candidates[i]);
temp.remove(temp.size()-1);}else{break;}}}}
42.接雨水
classSolution{public int trap(int[] height){
int result =0;if(height ==null){return0;}
Stack<Integer> stack =newStack<>();for(int i =0; i < height.length; i++){while(!stack.isEmpty()&& height[stack.peek()]< height[i]){
int temp = stack.pop();while(!stack.isEmpty()&& height[stack.peek()]== height[temp]){
stack.pop();}if(!stack.isEmpty()){
int left = stack.peek();
result +=(Math.min(height[i], height[left])- height[temp])*(i - left -1);}}
stack.push(i);}return result;}}
classSolution{public int maxSubArray(int[] nums){if(nums ==null)return0;
int[] dp =newint[nums.length];
dp[0]= nums[0];
int res = nums[0];for(int i =1; i < nums.length; i++){
dp[i]= Math.max(nums[i], nums[i]+ dp[i -1]);
res = Math.max(res, dp[i]);}return res;}}
55.跳跃游戏
publicclassSolution{public boolean canJump(int[] nums){
int des = nums.length -1;
int canReach =0;for(int i =0; i < nums.length; i++){if(i <= canReach){
canReach = Math.max(canReach, i + nums[i]);if(canReach >= des){returntrue;}}}returnfalse;}}
62.不同路径
classSolution{public int uniquePaths(int m, int n){
int[][] road =newint[m][n];for(int i =0; i < m; i++){
road[i][0]=1;}for(int i =1; i < n; i++){
road[0][i]=1;}for(int i =1; i < m; i++){for(int j =1; j < n; j++){
road[i][j]= road[i -1][j]+ road[i][j -1];}}return road[m -1][n -1];}}
64.最小路径和
classSolution{public int minPathSum(int[][] grid){if(grid.length ==0)return-1;for(int i =1; i < grid.length; i++){
grid[i][0]+= grid[i -1][0];}for(int j =1; j < grid[0].length; j++){
grid[0][j]+= grid[0][j -1];}for(int i =1; i < grid.length; i++){for(int j =1; j < grid[0].length;j++){
grid[i][j]+= Math.min(grid[i -1][j], grid[i][j -1]);}}return grid[grid.length -1][grid[0].length -1];}}
70.爬楼梯
classSolution{public int climbStairs(int n){
int[] dp =newint[n +1];
dp[0]=1;
dp[1]=1;for(int i =2; i <= n; i++){
dp[i]= dp[i -1]+ dp[i -2];}return dp[n];}}
75.颜色分类
classSolution{publicvoidsortColors(int[] nums){
int zero =0;
int one =0;
int two =0;
int length = nums.length;for(int i =0; i < length; i++){
int temp = nums[i];
nums[two]=2;
two++;if(temp <=1){
nums[one]=1;
one++;}if(temp ==0){
nums[zero]=0;
zero++;}}}}
79.单词搜索
classSolution{public boolean exist(char[][] board, String word){if(board.length ==0)returnfalse;
char[] chars = word.toCharArray();for(int i =0; i < board.length; i++){for(int j =0; j < board[0].length; j++){if(dfs(board, i, j, chars,0))returntrue;}}returnfalse;}private boolean dfs(char[][] board, int i, int j, char[] chars, int begin){if(begin >= chars.length){returntrue;}if(i <0|| i >= board.length || j <0|| j >= board[0].length
|| board[i][j]!= chars[begin]){returnfalse;}else{
char temp = board[i][j];
board[i][j]='/';try{returndfs(board, i +1, j, chars, begin +1)||dfs(board, i -1, j, chars, begin +1)||dfs(board, i, j +1, chars, begin +1)||dfs(board, i, j -1, chars, begin +1);}finally{
board[i][j]= temp;}}}}
102.二叉树的层序遍历
classSolution{public List<List<Integer>>levelOrder(TreeNode root){
List<List<Integer>> res =newArrayList<>();
Deque<TreeNode> deque =newLinkedList<>();if(root ==null){return res;}
deque.add(root);while(!deque.isEmpty()){
int size = deque.size();
List<Integer> temp =newArrayList<>();for(int i =0; i < size; i++){
TreeNode node = deque.poll();if(node.left !=null) deque.add(node.left);if(node.right !=null) deque.add(node.right);
temp.add(node.val);}
res.add(temp);}return res;}}
Loading Comments...