数列还原-回溯法

数列还原

http://www.nowcoder.com/questionTerminal/b698e67a2f5b450a824527e82ed7495d

开始想了一下动态规范和贪心什么的,完全没思路。

最后用dfs+回溯竟然没超时。

import java.util.*;
public class Main{
    private static int result=0;
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        while(sc.hasNext()){
            int n=sc.nextInt();
            int k=sc.nextInt();
            int[] nums=new int[n];
            for(int i=0;i<n;i++){
                nums[i]=sc.nextInt();
            }
             ArrayList<Integer> index=new ArrayList<>(); //数组中0的位置信息
             ArrayList<Integer> loss=new ArrayList<>();// 缺失的数字集合
             HashSet<Integer> set=new HashSet<>(); // 用set的contain方法快一点
        for(int i=0;i<n;i++){
            set.add(nums[i]);
            if(nums[i]==0)  {
                index.add(i);
                continue;
            }
            //减掉数组本身的正序数
            for(int j=i+1;j<n;j++){
                if(nums[j]>nums[i]&nums[i]!=0) k--;
            }
        }

        for(int i=1;i<=n;i++){
            if(!set.contains(i)){
                loss.add(i);
            }
        }
        backTracking(nums,index,loss,k,0);
        System.out.println(result);  
        }
        sc.close();

    }
    //回溯的模板
    public static void backTracking(int[] nums,ArrayList<Integer> index,ArrayList<Integer> loss,int k,int d){
        if(k==0&&loss.size()==0){
            result++;
            return;
        }
        if(k<0||d>=index.size()) return;
        int cur=index.get(d);
        for(int i=0;i<loss.size();i++){
            int tmp=loss.remove(i);
            nums[cur]=tmp;
            backTracking(nums,index,loss,k-count(nums,cur),d+1);
            nums[cur]=0;
            loss.add(i,tmp);
        }

    }
    //插入一个数之后新增的正序数
    public static int count(int[] nums,int pos){
        int ans=0;
        for(int i=0;i<pos;i++){
            if(nums[i]>0&&nums[i]<nums[pos]) ans++;
        }
        for(int i=pos+1;i<nums.length;i++){
            if(nums[i]>0&&nums[i]>nums[pos]) ans++;
        }
        return ans;
    }
}
全部评论

相关推荐

霁华Tel:秋招结束了,好累。我自编了一篇对话,语言别人看不懂,我觉得有某种力量在控制我的身体,我明明觉得有些东西就在眼前,但身边的人却说啥也没有,有神秘人通过电视,手机等在暗暗的给我发信号,我有时候会突然觉得身体的某一部分不属于我了。面对不同的人或场合,我表现出不一样的自己,以至于都不知道自己到底是什么样子的人。我觉得我已经做的很好,不需要其他人的建议和批评,我有些时候难以控制的兴奋,但是呼吸都让人开心。
点赞 评论 收藏
分享
一名愚蠢的人类:多少games小鬼留下了羡慕的泪水
投递荣耀等公司10个岗位
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务