LeetCode每日一题(题378,题718)

有序矩阵中第K小的元素

题目大意:给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第 k 小的元素。
请注意,它是排序后的第 k 小元素,而不是第 k 个不同的元素。

分析:这道题我一开始以为是搜索题,然后想了一会并没有想出来,最后采用了转换为1维数组排序的方式。
其实这道题的方法还是挺巧妙的,每次二分出一个数,判断小于等于这个数的元素是否为k个,如果是就向右移动,如果不是则向左移动。
接下来问题就转换为了如何查找这个矩阵中存在多少个小于等于这个数的元素,这个问题就和我们之前在剑指offer上的题目一样了,从左下或者右上出发,然后根据情况移动。
这里需要注意的是,每次移动的时候需要计算这一列有多少元素小于等于k,而不是单纯的count++。

class Solution {
    public int kthSmallest(int[][] matrix, int k) {
        if(matrix == null || matrix.length == 0 || matrix[0].length == 0)
            return 0;
        int length = matrix.length,width = matrix[0].length;
        int left = matrix[0][0],right =  matrix[length-1][width-1];
        while(left < right){
            int mid = left + (right-left)/2;
            if(check(matrix,k,mid, length, width)){
                right = mid;
            }else{
                left = mid + 1;
            }
        }
        return left;
    }
    public boolean check(int[][] matrix, int k,int mid,int length,int width){
        int count = 0;
        int i = length-1;
        int j = 0;
        while(i >=0 && j<width){
            if(matrix[i][j] <= mid){
                j++;
                //计算这里一列有多少元素满足条件
                count += i+1;
            }else{
                i--;
            }
        }
        return (k <= count);
    }
}

最长重复子数组

题目大意:给两个整数数组 A 和 B ,返回两个数组中公共的、长度最长的子数组的长度。

分析:这道题我一开始使用的是暴力求解,对于B数组的任意位置,判断A数组中的最长子串。经过剪枝之后也能够AC,但是时间效率就非常差。
这道题比较简单的做法就是采用DP。
对于任意位置dp[i][j]表示的是A[:i-1]和B[:j-1]处的最长公共子串,状态转移方程为:
dp[i][j] = A[i-1] == B[j-1]?dp[i-1][j-1]+1:0,然后记录一下最长的子串。
具体代码如下:

class Solution {
    public int findLength(int[] A, int[] B) {
        int max = 0;
        int[][] dp = new int[A.length + 1][B.length + 1];
        for (int i = 1; i <= A.length; i++) {
            for (int j = 1; j <= B.length; j++) {
                if (A[i - 1] == B[j - 1])
                    dp[i][j] = dp[i - 1][j - 1] + 1;
                else
                    dp[i][j] = 0;
                max = Math.max(max, dp[i][j]);
            }
        }
        return max;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_33241802/article/details/107082230