• leetcode-09(下一个排列+快乐数+全排列)


    思路:我们希望下一个数比当前数大,所以我们只需要将后面的大数与前面的小数交换即可,另外,增加的幅度要是最小,满足紧密排列

    所以我们需要从右往左进行低位交换,比如 123465,下一个排列应该把 5 和 4 交换而不是把 6 和 4 交换,所以这里思路是先循环找到>低位的低位位置,然后再来个循环从右边遍历,进行交换;

    交换完后,还需要考虑低位后的字串情况,可能是个降序的,比如123465 ,首先按照上一步,交换 5 和 4,得到 123564,那么低位后面也就是64明显是个降序,所以需要反转一下

    以求 12385764 的下一个排列为例:

    首先从后向前查找第一个相邻升序的元素对 (i,j)。这里 i=4j=5,对应的值为 57:(这里目的是找到低位位置)

    然后在 [j,end) 从后向前查找第一个大于 A[i] 的值 A[k]。这里 A[i] 是 5,故 A[k] 是 6:(从后面再遍历找到大于低位的值)

    将 A[i] 与 A[k] 交换。这里交换 56

    这时 [j,end) 必然是降序,逆置 [j,end),使其升序。这里逆置 [7,5,4]:(需要考虑交换后,低位后面的数是一个降序的数,毕竟小的放后面了)

    因此,12385764 的下一个排列就是 12386457

    1. class Solution {
    2. //从后往前找,直至arr[i]>arr[i-1],如果没有找到说明是降序,那么直接返回倒序,否则找到arr[i]>arr[i-1]的地方,将其换一下
    3. public static void nextPermutation(int[] nums) {
    4. boolean flag = true;
    5. int aid = -1;
    6. for (int i = nums.length - 1; i > 0; i--) {
    7. //1.找到后一个比前一个大的,用aid记录前一个状态,找到就说明不是降序
    8. if (nums[i] > nums[i - 1]) {
    9. aid = i - 1;
    10. flag = false;
    11. break;
    12. }
    13. }
    14. //2.根据flag状态进行判断是否为降序,true说明为降序
    15. if (flag) {
    16. reverse(nums, 0, nums.length - 1);
    17. return;
    18. }
    19. //3.因为第一个for是确定低位的,这里的for是确定大于低位的最小值然后进行交换
    20. for (int i = nums.length - 1; i > aid; i--) {
    21. //将遍历过的部分比i-1大的最小值和i-1的位置交换
    22. if(nums[i]>nums[aid]){
    23. int temp=nums[i];
    24. nums[i]=nums[aid];
    25. nums[aid]=temp;
    26. break;
    27. }
    28. }
    29. //4.交换后低位后的值为降序需要反转
    30. reverse(nums,aid+1, nums.length-1);
    31. return;
    32. }
    33. /**
    34. * 反转数组
    35. */
    36. public static void reverse(int[] nums, int start, int end) {
    37. while (start < end) {
    38. //1.交换
    39. int temp = nums[start];
    40. nums[start] = nums[end];
    41. nums[end] = temp;
    42. //2.缩小范围进一步交换
    43. start++;
    44. end--;
    45. }
    46. }
    47. }

    1. class Solution {
    2. public static boolean isHappy(int n){
    3. HashSet set = new HashSet<>();
    4. while (n!=1){
    5. set.add(n);
    6. //1.找到子数
    7. n=getNum(n);
    8. //2.去重
    9. if(set.contains(getNum(n))){
    10. return false;
    11. }
    12. }
    13. return true;
    14. }
    15. /**
    16. * 2.找到一个数的各个位数的和
    17. * @return
    18. */
    19. public static int getNum(int n){
    20. int num=0;
    21. while(n>0){
    22. int a = n % 10;
    23. num+=a*a;
    24. n/=10;
    25. }
    26. return num;
    27. }
    28. }

    1. class Solution {
    2. //将其分析为DFS,看做树形
    3. //结果集
    4. public List> permute(int[] nums) {
    5. List>result=new ArrayList<>();
    6. List list=new ArrayList<>();
    7. dfs(result,list,nums);
    8. return result;
    9. }
    10. //首先,自己定义一个dfs方法
    11. private void dfs(List>result,Listlist,int[] nums){
    12. //结束条件
    13. if(list.size()==nums.length){
    14. result.add(new ArrayList(list));
    15. return;
    16. }
    17. //分支操作
    18. for(int num:nums){
    19. //进行分支中放值的一个判断
    20. if(!list.contains(num)){
    21. list.add(num);
    22. //进行分支当中的一个递归
    23. dfs(result,list,nums);
    24. list.remove(list.size()-1);
    25. }
    26. }
    27. }
    28. }

  • 相关阅读:
    DataStream API(三)
    北京一所211大学计算机考研从一门改三门!北京化工大学改考
    数据结构:lambda表达式
    使用 ORM 与原始 SQL 的性能对比
    3396: [Usaco2009 Jan]Total flow 水流 (最大流)
    Spring mvc中Controller如何设置接受参数的默认值呢?
    数字图像处理(冈萨雷斯)学习笔记
    HTML5期末考核大作业,电影网站——橙色国外电影 web期末作业设计网页
    学习总结 | 真实记录 MindSpore 两日集训营能带给你什么(一)!
    npm 重要知识
  • 原文地址:https://blog.csdn.net/weixin_57128596/article/details/125907231