大家好,我是
方圆
无它,唯手熟尔
目录
递归
21. 合并两个有序链表
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if(l1 == null) return l2;
if(l2 == null) return l1;
if(l1.val < l2.val) {
l1.next = mergeTwoLists(l1.next,l2);
return l1;
}else {
l2.next = mergeTwoLists(l1,l2.next);
return l2;
}
}
}
101. 对称二叉树
class Solution {
public boolean isSymmetric(TreeNode root) {
return isMirror(root,root);
}
private boolean isMirror(TreeNode node1, TreeNode node2) {
if(node1 == null && node2 == null) return true;
if(node1 == null || node2 == null) return false;
return (node1.val == node2.val) && isMirror(node1.left,node2.right)
&& isMirror(node1.right,node2.left);
}
}
104. 二叉树的最大深度
class Solution {
public int maxDepth(TreeNode root) {
if(root == null) return 0;
int left = maxDepth(root.left);
int right = maxDepth(root.right);
return Math.max(left,right) + 1;
}
}
226. 翻转二叉树
class Solution {
public TreeNode invertTree(TreeNode root) {
if(root == null) return null;
TreeNode temp = root.left;
root.left = root.right;
root.right = temp;
invertTree(root.left);
invertTree(root.right);
return root;
}
}
236. 二叉树的最近公共祖先
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if(root == null || root == p || root == q) return root;
TreeNode left = lowestCommonAncestor(root.left,p,q);
TreeNode right = lowestCommonAncestor(root.right,p,q);
if(left == null && right == null) return null;
if(left == null) return right;
if(right == null) return left;
return root;
}
}
分治法、二分法
23. 合并K个升序链表
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
if(lists == null || lists.length == 0) return null;
return helper(lists,0,lists.length - 1);
}
private ListNode helper(ListNode[] lists, int left, int right) {
if(left == right) return lists[left];
int mid = (left + right) / 2;
ListNode head = helper(lists,left,mid);
ListNode tail = helper(lists,mid + 1,right);
return merge(head,tail);
}
private ListNode merge(ListNode head, ListNode tail) {
if(head == null) return tail;
if(tail == null) return head;
if(head.val < tail.val) {
head.next = merge(head.next,tail);
return head;
}else {
tail.next = merge(head,tail.next);
return tail;
}
}
}
33. 搜索旋转排序数组
class Solution {
public int search(int[] nums, int target) {
int left = 0, right = nums.length - 1;
while(left <= right) {
int mid = (left + right) / 2;
if(target == nums[mid]) return mid;
if(nums[mid] >= nums[left]) {
if(target >= nums[left] && target <= nums[mid])
right = mid - 1;
else
left = mid + 1;
}else {
if(target >= nums[mid] && target <= nums[right])
left = mid + 1;
else
right = mid - 1;
}
}
return -1;
}
}
34. 在排序数组中查找元素的第一个位置和最后一个位置
class Solution {
public int[] searchRange(int[] nums, int target) {
int left = 0, right = nums.length - 1;
while(left <= right) {
int mid = (left + right) / 2;
if(target > nums[mid]) {
left = mid + 1;
}else if(target < nums[mid]) {
right = mid - 1;
}else {
left = mid;
right = mid;
while(left > 0 && nums[left - 1] == target) left--;
while(right < nums.length - 1 && nums[right + 1] == target) right++;
return new int[] {
left,right};
}
}
return new int[] {
-1,-1};
}
}
动态规划
5. 最长回文子串
class Solution {
public String longestPalindrome(String s) {
int len = s.length();
if(len < 2) return s;
int maxLen = 1;
int begin = 0;
char[] chars = s.toCharArray();
boolean[][] dp = new boolean[len][len];
for(int i = 0; i < len; i++) dp[i][i] = true;
for(int j = 1; j < len; j++) {
for(int i = 0; i < j; i++) {
if(chars[i] != chars[j]) dp[i][j] = false;
else{
if(j - i < 3) dp[i][j] = true;
else {
if(dp[i + 1][j - 1]) dp[i][j] = true;
}
}
if(dp[i][j] && j - i + 1 > maxLen) {
maxLen = j - i + 1;
begin = i;
}
}
}
return s.substring(begin,begin + maxLen);
}
}
53. 最大子序和
class Solution {
public int maxSubArray(int[] nums) {
if(nums == null || nums.length == 0) return 0;
int res = nums[0];
int[] dp = new int[nums.length];
dp[0] = nums[0];
for(int i = 1; i < nums.length; i++) {
if(dp[i - 1] >= 0) dp[i] = nums[i] + dp[i - 1];
else dp[i] = nums[i];
if(dp[i] > res) res = dp[i];
}
return res;
}
}
62. 不同路径
class Solution {
public int uniquePaths(int m, int n) {
int[][] dp = new int[m][n];
for(int i = 0;i < n; i++) dp[0][i] = 1;
for(int j = 0;j < m; j++) dp[j][0] = 1;
for(int i = 1; i < m; i++) {
for(int j = 1; j < n; j++) {
dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
}
}
return dp[m - 1][n - 1];
}
}
64. 最小路径和
class Solution {
public int minPathSum(int[][] grid) {
int m = grid.length, n = grid[0].length;
for(int i = 1; i < n; i++) grid[0][i] += grid[0][i - 1];
for(int j = 1; j < m; j++) grid[j][0] += grid[j - 1][0];
for(int i = 1; i < m; i++) {
for(int j = 1; j < n; j++) {
grid[i][j] += Math.min(grid[i - 1][j],grid[i][j - 1]);
}
}
return grid[m - 1][n - 1];
}
}
70. 爬楼梯
class Solution {
public int climbStairs(int n) {
int[] dp = new int[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];
}
}
118. 杨辉三角
class Solution {
public List<List<Integer>> generate(int numRows) {
List<List<Integer>> res = new ArrayList<>(numRows);
for(int i = 0; i < numRows; i++) {
List<Integer> temp = new ArrayList<>(i + 1);
for(int j = 0; j <= i; j++) {
if(j == 0 || j == i) temp.add(1);
else {
List<Integer> pre = res.get(i - 1);
temp.add(pre.get(j - 1) + pre.get(j));
}
}
res.add(temp);
}
return res;
}
}
300. 最长上升子序列
class Solution {
public int lengthOfLIS(int[] nums) {
int[] dp = new int[nums.length];
Arrays.fill(dp,1);
int res = 0;
for(int i = 0; i < nums.length; i++) {
for(int j = 0; j < i; j++) {
if(nums[j] < nums[i]) dp[i] = Math.max(dp[i],dp[j] + 1);
}
if(dp[i] > res) res = dp[i];
}
return res;
}
}
1143. 最长公共子序列
class Solution {
public int longestCommonSubsequence(String text1, String text2) {
int m = text1.length(), n = text2.length();
int[][] dp = new int[m + 1][n + 1];
dp[0][0] = 0;
for(int i = 0; i < m; i++) {
for(int j = 0; j < n; j++) {
char c1 = text1.charAt(i), c2 = text2.charAt(j);
if(c1 == c2) dp[i + 1][j + 1] = dp[i][j] + 1;
else {
dp[i + 1][j + 1] = Math.max(dp[i][j + 1],dp[i + 1][j]);
}
}
}
return dp[m][n];
}
}
1277. 统计全为1的正方形子矩阵
class Solution {
public int countSquares(int[][] matrix) {
int m = matrix.length, n = matrix[0].length;
int[][] dp = new int[m][n];
int res = 0;
for(int i = 0;i < n; i++) {
dp[0][i] = matrix[0][i];
res += dp[0][i];
}
for(int j = 1; j < m; j++) {
dp[j][0] = matrix[j][0];
res += dp[j][0];
}
for(int i = 1; i < m; i++) {
for(int j = 1; j < n; j++) {
if(matrix[i][j] == 1){
dp[i][j] = Math.min(Math.min(dp[i - 1][j],dp[i][j - 1]),dp[i - 1][j - 1]) + 1;
res += dp[i][j];
}
}
}
return res;
}
}
加油儿!今天就要返校了,可能这是我上大学以来要度过的最短的学期了,希望同学们都平平安安的,也希望自己在秋招能收获到满意的Offer!