一、力扣
1、整数反转
class Solution {
public int reverse(int x) {
int ans = 0;
if (x < 0)
ans = 1;
x = Math.abs(x);
int res = 0;
String xos = Integer.toString(x);
for (int i = xos.length() - 1; i >= 0; i--) {
int temp = xos.charAt(i) - '0';
if (res > (Integer.MAX_VALUE - temp) / 10) {
return 0;
} else {
res = res * 10 + temp;
}
}
return ans == 1 ? -res : res;
}
}
2、组合总和 II
class Solution {
List<List<Integer>> res;
List<Integer> path;
int target;
int[] candidates;
public List<List<Integer>> combinationSum2(int[] candidates, int target) {
res = new ArrayList<>();
path = new ArrayList<>();
Arrays.sort(candidates);
this.candidates = candidates;
this.target = target;
int[] vis = new int[candidates.length];
dfs(0, 0, vis);
return res;
}
public void dfs(int start, int sum, int[] vis) {
if (sum > target)
return;
if (sum == target) {
res.add(new ArrayList<>(path));
return;
}
for (int i = start; i < candidates.length; i++) {
if (i > 0 && candidates[i] == candidates[i - 1] && vis[i - 1] == 0)
continue;
vis[i] = 1;
path.add(candidates[i]);
dfs(i + 1, sum + candidates[i], vis);
vis[i] = 0;
path.removeLast();
}
}
}
3、删除有序数组中的重复项
class Solution {
public int removeDuplicates(int[] nums) {
int point = 1;
int n = nums.length;
for (int i = 1; i < n; i++) {
if (nums[i] != nums[i - 1]) {
nums[point] = nums[i];
point++;
}
}
return point;
}
}
4、买卖股票的最佳时机含冷冻期
class Solution {
public int maxProfit(int[] prices) {
int n = prices.length;
int[][] dp = new int[n][3];//0:不持有股票(可以随时买入),1:持有股票,2:在今天卖出股票
dp[0][1] = -prices[0];
for (int i = 1; i < n; i++) {
dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][2]);
dp[i][1] = Math.max(dp[i - 1][1], dp[i - 1][0] - prices[i]);
dp[i][2] = dp[i - 1][1] + prices[i];
}
return Math.max(dp[n - 1][0], dp[n - 1][2]);
}
}
5、 买卖股票的最佳时机含手续费
class Solution {
public int maxProfit(int[] prices, int fee) {
int n = prices.length;
int[][] dp = new int[n][2];
dp[0][1] = -fee - prices[0];
for (int i = 1; i < n; i++) {
dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][1] + prices[i]);
dp[i][1] = Math.max(dp[i - 1][1], dp[i - 1][0] - fee - prices[i]);
}
return dp[n - 1][0];
}
}
6、最长递增子序列
class Solution {
public int lengthOfLIS(int[] nums) {
int n = nums.length;
int[] dp = new int[n + 1];
int len = 1;
dp[len] = nums[0];
for (int i = 1; i < n; i++) {
if (nums[i] > dp[len]) {
dp[++len] = nums[i];
} else {
int left = 1, right = len;
while (left < right) {
int mid = (left + right) / 2;
if (dp[mid] < nums[i]) {
left = mid + 1;
} else {
right = mid;
}
}
dp[left] = nums[i];
}
}
return len;
}
}
7、最长重复子数组
因为子数组要求是连续的,dp[i][j]是以nums1[i]和nums2[j]为结尾的最长子数组长度。(必须包括nums1[i]和nums2[j])。
class Solution {
public int findLength(int[] nums1, int[] nums2) {
int m = nums1.length, n = nums2.length;
int[][] dp = new int[m + 1][n + 1];
int res = 0;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (nums1[i] == nums2[j]) {
dp[i + 1][j + 1] = Math.max(dp[i + 1][j + 1], dp[i][j] + 1);
}
res = Math.max(res, dp[i + 1][j + 1]);
}
}
return res;
}
}
8、最长公共子序列
因为子序列不要求连续,dp[i][j] 表示 text1[0:i] 和 text2[0:j] 的最长公共子序列的长度。(可以不选text1[i]或text2[j])。
class Solution {
public int longestCommonSubsequence(String text1, String text2) {
int m = text1.length(), n = text2.length();
int[][] dp = new int[m + 1][n + 1];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (text1.charAt(i) == text2.charAt(j)) {
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];
}
}