LeetCode每日一题(20200827)

原题地址:

思考过程:

读完题目,首先想到的是用dfs或者bfs的思路解题,dfs,首先从所有行程中,找到“JFK”开始的行程,然后把此行程的to添加到ans,切to为新的开始行程,并把此行程删除后,再在剩下的行程中找开始行程,依次。然后找到一个结果后,保存,再找到一个结果,和上一次的比较后保存字符自然排序靠前的结果。

代码实现:

    //[["JFK","SFO"],["JFK","ATL"],["SFO","ATL"],["ATL","JFK"],["ATL","SFO"]]
    public List<String> findItinerary(List<List<String>> tickets) {

        if (tickets.size() < 1) {
            return new ArrayList<>();
        }
        String start = "JFK";
        List<String> result = new ArrayList<>();
        List<String> ans = new ArrayList<>();
        ans.add(start);
        Set<String> history = new HashSet<>();
        dfs(tickets, ans, result, history, tickets.size() + 1);
        return result;
    }

    private void dfs(List<List<String>> tickets, List<String> ans,
                     List<String> result, Set<String> history, int len) {
        if (tickets.size() == 0 && ans.size() == len) {
            if (result.size() == 0) {
                result.addAll(ans);
            } else {
                boolean replace = false;
                for (int i = 0; i < ans.size(); i++) {
                    int com = result.get(i).compareTo(ans.get(i));
                    if (com > 0) {
                        replace = true;
                        break;
                    } else if (com < 0) {
                        break;
                    }
                }
                if (replace) {
                    result.clear();
                    result.addAll(ans);
                }
            }
            return;
        }

        StringBuilder ansStr = new StringBuilder();
        for (String s : ans) {
            ansStr.append(s);
        }
        if (history.contains(ansStr.toString())) {
            return;
        }
        history.add(ansStr.toString());

        String lastTo = ans.get(ans.size() - 1);
        for (int j = 0; j < tickets.size(); j++) {
            List<String> route = tickets.get(j);
            String from = route.get(0);
            String to = route.get(1);
            if (lastTo.equals(from)) {
                List<String> newAns = new ArrayList<>(ans);
                newAns.add(to);

                List<List<String>> newTic = new ArrayList<>(tickets);
                newTic.remove(j);

                dfs(newTic, newAns, result, history, len);
            }
        }
    }

执行结果:

   超时。说明解题思路是对的,代码也能够求解简单的题,但是效率不够。

 

查看官方解法:

使用 Hierholzer算法 解决欧路径问题。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值