博客记录-day159-力扣(股票)

73 阅读3分钟

一、力扣

1、整数反转

7. 整数反转

image.png

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

40. 组合总和 II

image.png

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、删除有序数组中的重复项

26. 删除有序数组中的重复项

image.png

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、买卖股票的最佳时机含冷冻期

309. 买卖股票的最佳时机含冷冻期

image.png

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、 买卖股票的最佳时机含手续费

714. 买卖股票的最佳时机含手续费

image.png

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、最长递增子序列

300. 最长递增子序列

image.png

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、最长重复子数组

718. 最长重复子数组

image.png

因为子数组要求是连续的,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、最长公共子序列

1143. 最长公共子序列

image.png

因为子序列不要求连续,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];
    }
}