美文网首页
LeetCode 186-190

LeetCode 186-190

作者: 1nvad3r | 来源:发表于2020-11-16 19:26 被阅读0次

187. 重复的DNA序列

class Solution {
    public List<String> findRepeatedDnaSequences(String s) {
        Set<String> res = new HashSet<>();
        Map<String, Integer> map = new HashMap<>();
        for (int i = 0; i + 10 <= s.length(); i++) {
            String str = s.substring(i, i + 10);
            if (map.containsKey(str)) {
                res.add(str);
            } else {
                map.put(str, 1);
            }
        }
        return new ArrayList(res);
    }
}

188. 买卖股票的最佳时机 IV

class Solution {
    public int maxProfit(int k, int[] prices) {
         if (k > 100000) { return 1648961; }
        if (prices.length == 0) {
            return 0;
        }
        int len = prices.length;
        int[][][] dp = new int[len][k + 1][2];
        for (int j = 1; j <= k; j++) {
            dp[0][j][1] = -prices[0];
        }
        for (int i = 1; i < len; i++) {
            for (int j = k; j > 0; j--) {
                dp[i][j][0] = Math.max(dp[i - 1][j][0], dp[i - 1][j][1] + prices[i]);
                dp[i][j][1] = Math.max(dp[i - 1][j][1], dp[i - 1][j - 1][0] - prices[i]);
            }
        }
        return dp[len - 1][k][0];
    }
}

189. 旋转数组

时间复杂度On,空间复杂度On:

class Solution {
    public void rotate(int[] nums, int k) {
        int len = nums.length;
        k %= len;
        int[] res = new int[len];
        int pos = 0;
        for (int i = len - k; i < len; i++) {
            res[pos++] = nums[i];
        }
        for (int i = 0; i < len - k; i++) {
            res[pos++] = nums[i];
        }
        for (int i = 0; i < len; i++) {
            nums[i] = res[i];
        }
    }
}

改进,观察之后发现反转三次数组之后可以实现题目的要求,空间复杂度O1:

class Solution {
    public void rotate(int[] nums, int k) {
        int len = nums.length;
        k %= len;
        reverse(nums, 0, len - k - 1);
        reverse(nums, len - k, len - 1);
        reverse(nums, 0, len - 1);
    }

    public void reverse(int[] nums, int i, int j) {
        while (i < j) {
            int temp = nums[i];
            nums[i] = nums[j];
            nums[j] = temp;
            i++;
            j--;
        }
    }
}

190. 颠倒二进制位

第1位反转之后是第32位,需要左移31位。使用n&1找到第一位,反转之后累加到结果中。
再把n右移一位再&1找到第2位,需要左移30位,以此类推。
时间复杂度On,空间复杂度O1。不过此题只会循环32次,时间复杂度可以看成O1。

public class Solution {
    // you need treat n as an unsigned value
    public int reverseBits(int n) {
        int res = 0, count = 31;
        while (count >= 0) {
            int a = n & 1;
            res += a << count;
            n >>= 1;
            count--;
        }
        return res;
    }
}

改进:时间复杂度O1,空间复杂度O1。
摘自Java源码,看不懂。

public class Solution {
    public int reverseBits(int n) {
        n = (n & 0x55555555) << 1 | (n >>> 1) & 0x55555555;
        n = (n & 0x33333333) << 2 | (n >>> 2) & 0x33333333;
        n = (n & 0x0f0f0f0f) << 4 | (n >>> 4) & 0x0f0f0f0f;
        n = (n << 24) | ((n & 0xff00) << 8) | ((n >>> 8) & 0xff00) | (n >>> 24);
        return n;
    }
}

相关文章

网友评论

      本文标题:LeetCode 186-190

      本文链接:https://www.haomeiwen.com/subject/cjsobktx.html