简单题记录

本文解析了多个LeetCode上的经典算法题目,包括二维矩阵求和、买卖股票的最佳时机、二叉搜索树节点间的最小距离等,提供了清晰的解题思路和高效代码实现。

304. Range Sum Query 2D - Immutable
题意:求二维矩阵中任意子矩阵和。inclusive。
还是动规。trick和303一样,但一定一定要考虑到空矩阵!!

class NumMatrix {
    private int[][] sum;
    public NumMatrix(int[][] mat) {
        int row = mat.length+1, col;
        if(row>1) col = mat[0].length+1;
        else col=1;
        sum = new int[row][col];
        for(int i=0;i<row-1;i++){
            for(int j=0;j<col-1;j++){
                sum[i+1][j+1] = mat[i][j]+sum[i+1][j]+sum[i][j+1]-sum[i][j];
            }
        }
    }
    public int sumRegion(int row1, int col1, int row2, int col2) {
        return sum[row2+1][col2+1]-sum[row2+1][col1]-sum[row1][col2+1]+sum[row1][col1];
    }
}

303. Range Sum Query - Immutable
题意:求任意子序列和。inclusive
是很容易的题目,但实现上有个trick,就是因为前后包含,所以直接sum[j]-sum[i-1]会下标溢出。。所以不如直接用sum[j+1]来记录下标<=j的所有元素和。

121. Best Time to Buy and Sell Stock
题意:给定一数组,求a[j]-a[i]最大值。(i

class Solution {
    public int rob(int[] nums){
        int len = nums.length;
        int a=0, b=0;
        for(int i=0;i<len;i++){
            if(i%2==0) a=Math.max(a+nums[i], b);
            else b.Math.max(a, b+nums[i]);
        }
        return Math.max(a,b);
    }
}

783. Minimum Distance Between BST Nodes
题意:找到一棵BST上节点值的最小差距。TMD直接遍历读成数组排序。。。气死了这么简单的题因为语法做了半小时。
注意:对Vector排序是Collections.sort(v),自己的代码看这里
以下才是最好的解法. because it is a BST thus inOrder traversal values are sorted。
另外,如果不是BST,通用解法看这里,相同题目看530

class Solution {
    Integer res = Integer.MAX_VALUE, pre = -1;
    public int minDiffInBST(TreeNode root) {
        if (root.left != null) minDiffInBST(root.left);
        if (pre >=0 ) res = Math.min(res, root.val - pre);
        pre = root.val;
        if (root.right != null) minDiffInBST(root.right);
        return res;
    }
}

760. Find Anagram Mappings
题意:给定A B两个数组,是同样一串数字的不同排列。依次找出A中元素在B中的出现位置。
解法:两个HashMap记录A B中各个数字位置,即mapA.put(A[i], i); mapB.put(B[i], i);之后依次返回mapB.get(A[i])即可。
备注:鄙人用java在leetcode上做的第一道题。。语法上很不熟悉,折腾了很久才懂怎么用hashmap,然后hashmap中的元素get出来后要int强制转换才能用:(int)mapB.get(A[i])

class Solution {
    public int[] anagramMappings(int[] A, int[] B) {
        int len = A.length;
        int[] ans = new int[len];
        HashMap mapA = new HashMap();
        HashMap mapB = new HashMap();
        for (int i=0;i<len;i++){
            mapA.put(A[i], i);
            mapB.put(B[i], i);
        }
        for(int i=0;i<len;i++){
            ans[i]=(int)mapB.get(A[i]);
        }
        return ans;
    }
}

762. Prime Number of Set Bits in Binary Representation
题意:给定两整数L,R,找出[L,R]内满足以下条件的数的个数:二进制表示有质数个1。L <= R in the range [1, 10^6]
解法:最佳答案更简单。感觉代码能力被碾压。。
For each number from L to R, let’s find out how many set bits it has. If that number is 2, 3, 5, 7, 11, 13, 17, or 19, then we add one to our count. We only need primes up to 19 because R < 10^6 < 2^20

class Solution {
    public int countPrimeSetBits(int L, int R) {
        int ans = 0;
        for (int x = L; x <= R; ++x)
            if (isSmallPrime(Integer.bitCount(x)))
                ans++;
        return ans;
    }
    public boolean isSmallPrime(int x) {
        return (x == 2 || x == 3 || x == 5 || x == 7 ||
                x == 11 || x == 13 || x == 17 || x == 19);
    }
}

748. Shortest Completing Word
题意:在words中找到一个最短的单词,其字母都来源于给定字符串。
解法:先去掉给定字符串中的非字母,然后words中的单词依次判断,记录最短长度。思路不难然而代码略长。

class Solution {
    public String shortestCompletingWord(String S, String[] words) {
        //Comparator cmp = new MyComparator();
        //Arrays.sort(words, cmp);
        Vector v = new Vector(7);
        for(int i=0;i<S.length();i++){
            if(Character.isWhitespace(S.charAt(i))) continue;
            if(Character.isDigit(S.charAt(i))) continue;
            if(Character.isUpperCase(S.charAt(i))){
                v.add(Character.toLowerCase(S.charAt(i)));
            }
            else v.add(S.charAt(i));
        }
        //System.out.println(v);
        String ans="";
        int len = 20;
        for(int i=0;i<words.length;i++){
            if(Can(words[i], v)){
                if(words[i].length()<len){
                    len = words[i].length();
                    ans = words[i];
                }
            }
        }
        return ans;
    }
    boolean Can(String word, Vector v){
        int cnt=0;
        for(int i=0;i<word.length();i++){
            if(Character.isUpperCase(word.charAt(i))){
                Character.toLowerCase(word.charAt(i));
            }
        }
        boolean[] used = new boolean[1000];
        for(int j=0;j<word.length();j++){
            used[j]=false;
        }
        for(int i=0;i<v.size();i++){
            for(int j=0;j<word.length();j++){
                if(!used[j] && word.charAt(j) == (Character)v.get(i)){
                    used[j]=true;
                    cnt++;break;
                }
            }
        }
        if(cnt==v.size()) return true;
        else return false;
    }
}

169. Majority Element
就是找数组中的众数。。。

class Solution {
    public int majorityElement(int[] nums) {
        Map<Integer, Integer> map = new HashMap<>();
        int max_=0, max_num=nums[0];
        for(int i=0;i<nums.length;i++){
            map.put(nums[i], map.getOrDefault(nums[i], 0) + 1 );
            if(max_<map.get(nums[i])){
                max_= map.get(nums[i]); max_num=nums[i];
            }
        }
        return max_num;
    }
}

566. Reshape the Matrix
实现python/MATLAB中的reshape功能。

int cnt=0;
for(int i=0;i<row;i++){
    for(int j=0;j<col;j++){
        ans[cnt/c][cnt%c]=nums[i][j];
        cnt++;
    }
}

66. Plus One
一个整数用数组表示。返回加一后的结果。
下面是最佳答案。这思路真是牛。比较tricky。

public int[] plusOne(int[] digits) {
    int n = digits.length;
    for(int i=n-1; i>=0; i--) {
        if(digits[i] < 9) {
            digits[i]++;
            return digits;
        }
        digits[i] = 0;
    }
    int[] newNumber = new int [n+1];
    newNumber[0] = 1;
    return newNumber;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值