2017百度软件开发实习生编程题第三题,全排列问题

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class baidu3 {
public static void main(String[] args)
{
Scanner scanner=new Scanner(System.in);
while (scanner.hasNext()) {
int n=scanner.nextInt();
int k=scanner.nextInt();
int[] t=new int[n];
   for (int i = 0; i < t.length; i++) {
t[i]=i+1;
}
   ArrayList<List<Integer>> num=permute(t);
       int less = k;//小于号
       int large = n - k - 1;//大于号
       
       int ans = 0;
//计算大小符号的问题,这边采用逐步减一并判断最后的符号数是否都为0进行计数。
       for (int i = 0; i < num.size(); ++i) {
           List<Integer> list = num.get(i);
           for (int j = 1; j < list.size(); ++j) {
               if (list.get(j) < list.get(j-1)) {
                   large -= 1;
               } else {
                   less -= 1;
               }
               
           }
           if (less == 0 && large == 0) {
               ans++;
           }
//每次遍历完一个list后要将符号数量恢复到初始
           less=k;
                large = n - k - 1;
       }
   System.out.println(ans);
   
}
}
//下面的作用就是全排序
public static ArrayList<List<Integer>> permute(int[] nums) {
         ArrayList<List<Integer>> rst = new ArrayList<List<Integer>>();
         if (nums == null) {
             return rst; 
         }
         
         if (nums.length == 0) {
            rst.add(new ArrayList<Integer>());
            return rst;
         }

         ArrayList<Integer> list = new ArrayList<Integer>();
         helper(rst, list, nums);
         return rst;
    }
    
    public static void helper(ArrayList<List<Integer>> rst, ArrayList<Integer> list, int[] nums){
        if(list.size() == nums.length) {
            rst.add(new ArrayList<Integer>(list));
            return;
        }
        
        for(int i = 0; i < nums.length; i++){
            if(list.contains(nums[i])){
                continue;
            }
            list.add(nums[i]);
            helper(rst, list, nums);
            list.remove(list.size() - 1);
        }
        
    }
}

#百度#
全部评论
AC了咩
点赞
送花
回复
分享
发布于 2017-04-27 21:43
学习了。
点赞
送花
回复
分享
发布于 2017-04-27 21:59
滴滴
校招火热招聘中
官网直投
思路跟你一样,内存超了,c***
点赞
送花
回复
分享
发布于 2017-04-27 22:20
我只不过在helper里面多加了一个arraylist,就超时了,30%- -  这么夸张?
点赞
送花
回复
分享
发布于 2017-04-28 21:10
#include <cstdio> unsigned int dp[1000][1001]; void initDP(int n, int k) { for (size_t i = 0; i <= n; i++) { dp[0][i] = 1; } for (size_t i = 1; i <= k; i++) { dp[i][1] = 0; } } int countPermutation(int n, int k) { initDP(n, k); for (size_t row = 1; row <= k; row++) { for (size_t col = row + 1; col <= n; col++) { dp[row][col] = 0; dp[row][col] += dp[row][col - 1] * (row + 1); dp[row][col] += dp[row - 1][col - 1] * (col - row); dp[row][col] %= 2017; } } return dp[k][n]; } int main() { int n, k; scanf("%d%d", &n, &k); printf("%d", countPermutation(n, k)); return 0; }
点赞
送花
回复
分享
发布于 2017-04-28 21:30
头条内推码4EXU9YH 投递链接:https://job.toutiao.com/campus/
点赞
送花
回复
分享
发布于 2017-09-08 22:16

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务