1131. 排列中的函数

1131. 排列中的函数

中文English

从1~nn 的全排列共有 n!n! 种。例如 n = 3n=3,共有 3!=63!=6 种排列如下:

1,2,3
1,3,2
2,1,3
2,3,1
3,1,2
3,2,1

对于 nn 的任意一种排列 AA,A_xAx​​ 表示在第 xx 个位置上的数,1 \leq x \leq n1xn。定义一个函数F(x)F(x)如下:
F(x)= \begin{cases} A_1& \text{x = 1}\\ |F(x-1)-A_x|& \text{x = 2,3......n} \end{cases}F(x)={A1​​F(x1)Ax​​​​x = 1x = 2,3......n​​

其中 |x|x∣ 代表 xx 的绝对值。

现在给出 nn,请你求出:对于 nn 的全排列中,F(n)F(n) 的最小值和最大值分别是多少?结果的格式为[F(n)min, F(n)max][F(n)min,F(n)max]。

样例

输入样例: n=3

输出样例:[0, 2]

样例解释:
对于排列[1,2,3]:
F(1)=A_1=1F(1)=A1​​=1
F(2)=|F(1)-A_2|=|1-2|=1F(2)=F(1)A2​​=12=1
F(3)=|F(2)-A_3|=|1-3|=2F(3)=F(2)A3​​=13=2
所以该排列F(n)=2;
同理,[1,3,2]的F(n)=0;[2,1,3]的F(n)=2;[2,3,1]的F(n)=0;[3,1,2]的F(n)=0;[3,2,1]的F(n)=0;
因此,F(n)最小值为0,F(n)最大值为2,返回[0, 2]

注意事项

1 \leq n \leq 10^51n105​​

输入测试数据 (每行一个参数)如何理解测试数据?
 
1 [1,1]
2 [1,1]
3 [0,2]
4 [0,4]
5 [1,5]
6 [1,5]
7 [0,6]
最小的话,逆序 倒减
最大的话,n - min(上一个)

 第一个版本:代码超过时间限制

class Solution:
    """
    1.先写出一个列表下面的函数方法,然后全排列,放入res里面,最终返回[min(res),max(res)]
    """
    def minMax(self, n):
        # write your code here.
        res = [1,1]
        for j in range(2,n+1):
            d = [i for i in range(1,1+j)]
            res[0] = self.get_l(d[::-1])
            res[1] = j-res[0]
        
        return res
    

    def get_l(self,l):
        r_l = [0]*len(l)
        r_l[0] = l[0]
        for i in range(1,len(l)):
            r_l[i] = abs(l[i]-r_l[i-1])
        return r_l[-1]

lintcode版本:找规律

class Solution:
    """
    @param n: An integer.
    @return: Return [minF(n), maxF(n)].
    """
    """
    1.找规律,最小值[1,1,0,0],最大值就是当前n - 上一个最小值就是了
    """
    def minMax(self, n):
        # write your code here.
        
        min_l = [1,1,0,0]
        return [min_l[n%4-1],n-min_l[n%4-2]]

 

posted @ 2020-05-23 12:36  风不再来  阅读(280)  评论(0编辑  收藏  举报