Leetcode 46. 全排列

133 阅读1分钟

Leetcode 46. 全排列

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第17天,点击查看活动详情

❤️‍欢迎订阅java厂长《LeetCode每日一题》 ❤️‍

1、题目📑

给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。

实例1

输入: nums = [1,2,3]

输出: [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

实例2

输入: nums = [0,1]

输出: [[0,1],[1,0]]

实例3

输入: nums = [1]

输出: [[1]]

提示

  • 1 <= nums.length <= 6
  • -10 <= nums[i] <= 10
  • nums 中的所有整数 互不相同

2、思路🧠

方法一:字符串模拟

待更新!!

废话少说~~~~~上代码!

3、代码👨‍💻

第一次commit AC

class Solution {
    public String countAndSay(int n) {
        if(n == 1) return "1";
        String num = countAndSay(n - 1);
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i <= num.length() - 1; i++) {
            int count = 1;
            while(i < num.length() - 1 && num.charAt(i) == num.charAt(i + 1)) {
                count++;
                i++;
            }
            sb.append(count);
            sb.append(num.charAt(i));
        }
        return sb.toString();
    }
}

时间复杂度:O(N2)

空间复杂度:O(N)

第二次commit AC

class Solution {
    public String countAndSay(int n) {
        if(n == 1) return "1";
        String num = countAndSay(n - 1);
        StringBuffer sb = new StringBuffer();
        int i = 0, j = 1, len = num.length();
        while(j < len) {
            if (num.charAt(i) != num.charAt(j)) {
                sb.append(j - i).append(num.charAt(i));
                i = j;
            }
            j++;
        }
        sb.append(j - i).append(num.charAt(i));
        return sb.toString();
    }
}

image-20220610113614454

4、总结

该题目的对思维的分析与探讨,对于题目的解读能力是非常关键的,在力扣的刷题过程中,字符串的问题还是比较多的,在解决字符串的问题要灵活分析应用合适的方法进行拆解并提交。

❤️‍来自专栏《LeetCode基础算法题》欢迎订阅❤️‍

厂长写博客目的初衷很简单,希望大家在学习的过程中少走弯路,多学一些东西,对自己有帮助的留下你的赞赞👍或者关注➕都是对我最大的支持,你的关注和点赞给厂长每天更文的动力。

对文章其中一部分不理解,都可以评论区回复我,我们来一起讨论,共同学习,一起进步!

原题链接:46. 全排列 - 力扣(LeetCode)