zoukankan      html  css  js  c++  java
  • 565. Array Nesting

    Given an array A of positive integers (not necessarily distinct), return the lexicographically largest permutation that is smaller than A, that can be made with one swap (A swap exchanges the positions of two numbers A[i] and A[j]).  If it cannot be done, then return the same array.

    Example 1:

    Input: [3,2,1]
    Output: [3,1,2]
    Explanation: Swapping 2 and 1.
    

    Example 2:

    Input: [1,1,5]
    Output: [1,1,5]
    Explanation: This is already the smallest permutation.
    

    Example 3:

    Input: [1,9,4,6,7]
    Output: [1,7,4,6,9]
    Explanation: Swapping 9 and 7.
    

    Example 4:

    Input: [3,1,1,3]
    Output: [1,3,1,3]
    Explanation: Swapping 1 and 3.
    

    Note:

    1. 1 <= A.length <= 10000
    2. 1 <= A[i] <= 10000
    class Solution {
        public int arrayNesting(int[] nums) {
            int res = 0;
            for(int i = 0; i < nums.length; i++) {
                Set<Integer> set = new HashSet();
                int cur = nums[i];
                while(!set.contains(cur)) {
                    set.add(cur);
                    cur = nums[cur];
                }
                res = Math.max(res, set.size());
            }
            return res;
        }
    }

    brute force, 差点过,TLE了 O(n^2)

    class Solution {
        public int arrayNesting(int[] nums) {
            int res = 0;
            for(int i = 0; i < nums.length; i++) {
                int cur = 0;
                for(int j = i; nums[j] >= 0; cur++) {
                    int tmp = nums[j];
                    nums[j] = -1;
                    j = tmp;
                }
                res = Math.max(res, cur);
            }
            return res;
        }
    }

    O(n),标记visited过的点(-1),

    class Solution {
        public int arrayNesting(int[] nums) {
            int res = 0;
            for(int i = 0; i < nums.length; i++) {
                int cur = 0;
                int j = i;
                while(nums[j] >= 0) {
                    int tmp = nums[j];
                    nums[j] = -1;
                    j = tmp;
                    cur++;
                }
                res = Math.max(res, cur);
            }
            return res;
        }
    }

    用while循环更自然一点

  • 相关阅读:
    一分钟制作U盘版BT3
    微软历史最高市值是多少?
    Windows 7系统安装MySQL5.5.21图解
    cocos2d-x3.0 Physics新的物理引擎
    java使用javamail读取邮箱(收件箱为例)
    Java实现第九届蓝桥杯字母阵列
    Java实现第九届蓝桥杯字母阵列
    Java实现第九届蓝桥杯字母阵列
    Java实现第九届蓝桥杯猴子分香蕉
    Java实现第九届蓝桥杯猴子分香蕉
  • 原文地址:https://www.cnblogs.com/wentiliangkaihua/p/13494215.html
Copyright © 2011-2022 走看看