美文网首页
出差来回机票钱最少

出差来回机票钱最少

作者: 抬头挺胸才算活着 | 来源:发表于2021-10-23 21:21 被阅读0次

实现一个函数public int minPrice(int[] departing, int[] returning, int minDays, int maxDays),其中departing代表出发时的机票价格,returning代表回来时的机票价格,出发的时间介于minDays和maxDays之间,求出差花费的最少的机票钱。

例子:
departing = [5, 2, 3, 1, 1]
returning = [0, 1, 5, 2, 1]
minDays = 1
maxDays = 4
答案:2

  • 解法1:暴力解法
    两层for循环,先确定出发的日期i,再确定返回的日期时j属于[i + minDays, i + maxDays],然后求最少的机票钱,但这样会超时。

  • 解法2:单调队列
    每次固定出发日期i,都是求returning中一个窗口returning[i + minDays, i + maxDays]中机票钱的最少值,于是联想到单调队列求这个可以达到O(n)的复杂度。
    注意如队列的是i,而不是returning[i],这样在将队列中超期的数字移出队列的时候更好判断一些。

    public int minPrice(int[] departing, int[] returning, int minDays, int maxDays) {
        int n = departing.length;
        int duration = maxDays - minDays;

        int[] minReturns = new int[n - minDays];
        int count = 0;
        LinkedList<Integer> queue = new LinkedList<>();
        for (int i = minDays; i < n; i++) {
            while (!queue.isEmpty() && returning[queue.peekLast()] >= returning[i]) {
                queue.pollLast();
            }

            if (!queue.isEmpty() && queue.peekFirst() < (i - duration)) {
                queue.pollFirst();
            }

            queue.addLast(i);

            if (i < maxDays) {
                continue;
            }

            minReturns[count++] = returning[queue.peekFirst()];
        }

        for (int i = 0; i < duration; i++) {
            if (!queue.isEmpty() && queue.peekFirst() < (i - duration)) {
                queue.pollFirst();
            }

            minReturns[count++] = returning[queue.peekFirst()];
        }
        // int min = Integer.MAX_VALUE;
        // for (int i = 0; i < duration; i++) {
        //     min = Math.min(min, returning[n - 1 - i]);
        //     minReturns[minReturns.length - 1 - i] = min;
        // }

        int min = Integer.MAX_VALUE;
        for (int i = 0; i < minReturns.length; i++) {
            min = Math.min(min, departing[i] + minReturns[i]);
        }
        return min;
    }

    public static void main(String[] args) {
        System.out.println(new MinPrice().minPrice(new int[] {5, 2, 3, 1, 1}, new int[] {0, 1, 5, 2, 1}, 2, 3) == 3);
        System.out.println(new MinPrice().minPrice(new int[] {1, 2, 3, 1, 1}, new int[] {0, 1, 5, 2, 1}, 1, 4) == 2);
        System.out.println(new MinPrice().minPrice(new int[] {1, 2, 3, 1, 1}, new int[] {0, 1, 5, 2, 1}, 1, 1) == 2);
        System.out.println(new MinPrice().minPrice(new int[] {1, 2, 3, 1, 1}, new int[] {0, 1, 5, 2, 1}, 2, 2) == 4);
        System.out.println(new MinPrice().minPrice(new int[] {1, 2, 3, 1, 1}, new int[] {0, 1, 5, 2, 1}, 4, 4) == 2);

        System.out.println(new MinPrice().minPrice(new int[] {1, 2, 3, 4, 5}, new int[] {0, 1, 5, 2, 1}, 2, 2) == 4);
        System.out.println(new MinPrice().minPrice(new int[] {5, 4, 3, 2, 1}, new int[] {0, 1, 5, 2, 1}, 2, 2) == 4);
        System.out.println(new MinPrice().minPrice(new int[] {5, 4, 3, 2, 1}, new int[] {1, 2, 3, 4, 5}, 2, 2) == 8);
        System.out.println(new MinPrice().minPrice(new int[] {5, 2, 3, 1, 1}, new int[] {1, 2, 3, 4, 5}, 2, 2) == 6);
        System.out.println(new MinPrice().minPrice(new int[] {5, 2, 3, 1, 1}, new int[] {5, 4, 3, 1, 1}, 2, 2) == 3);

        System.out.println(new MinPrice().minPrice(new int[] {1, 1, 1, 1, 1}, new int[] {5, 4, 3, 1, 1}, 2, 2) == 2);
        System.out.println(new MinPrice().minPrice(new int[] {5, 2, 3, 1, 1}, new int[] {1, 1, 1, 1, 1}, 2, 2) == 3);
        System.out.println(new MinPrice().minPrice(new int[] {5, 2, 3, 1, 1}, new int[] {1, 1, 2, 1, 1}, 2, 2) == 3);

        System.out.println(new MinPrice().minPrice(new int[] {5, 2, 3, 1, 1}, new int[] {1, 1, 2, 1, 1}, 1, 2) == 2);
        System.out.println(new MinPrice().minPrice(new int[] {5, 2, 3, 1, 1}, new int[] {1, 1, 2, 1, 1}, 1, 3) == 2);
        System.out.println(new MinPrice().minPrice(new int[] {5, 2, 3, 1, 1}, new int[] {1, 1, 2, 1, 1}, 1, 4) == 2);
        System.out.println(new MinPrice().minPrice(new int[] {5, 2, 3, 1, 1}, new int[] {1, 1, 2, 1, 1}, 2, 3) == 3);
        System.out.println(new MinPrice().minPrice(new int[] {5, 2, 3, 1, 1}, new int[] {1, 1, 2, 1, 1}, 2, 4) == 3);
        System.out.println(new MinPrice().minPrice(new int[] {5, 2, 3, 1, 1}, new int[] {1, 1, 2, 1, 1}, 4, 4) == 6);
    }

相关文章

  • 出差来回机票钱最少

    实现一个函数public int minPrice(int[] departing, int[] returnin...

  • 出差来回跑

    出差。 累死个人。 忙得昏天暗地,年底还有十来天。 要复盘今年做了什么。 刚看到蔡康永的“奇葩说”的一句话,觉得很...

  • 游桂林飞机票事件

    记得17年3月多去的桂林,从2月就开始看机票,从西安直飞桂林机票要800多,那时候刚上班,没多少钱,来回机票直飞的...

  • RooLife:你不知道的澳洲代购圈还能这样?

    你以为的海外代购画风: 天天拎着行李箱商场超市药房跑断腿, 打包快递发货忙的吃不上饭, 赚的钱还不够来回机票钱, ...

  • 无现金社会即将到来,你准备好了么?

    人物:一线城市IT从业者 事件1:春节过后未取过钱,四月初出差到深圳,出发前身上没有一分现金。出差四天时间,从机票...

  • 工作 | 出差随身行李攻略

    出差随身行李攻略——懒人清单list 1、车票类:汽车票、火车票、机票等(各类行程要事先合理安排); 2、钱包:钱...

  • 济州岛自由行-吃篇

    “娟儿,元旦和我去韩国吧,你护照有的吧。来回飞机票钱我会帮你买的,到那边吃住我也会安排的,你就去个人好了。” 听到...

  • 【杂记】泰山游记

    爬泰山 是在大年初一就定好了! 欠进妹约好的旅行 就去山东泰山吧 反正我也在山东出差 我是在初七公司来回机票回济南...

  • 如何用最少的钱提升出租屋的格调?

    最少的钱,最少的钱,最少的钱,重要的事情说3遍。 闲暇的时候看看自己十几平米的出租房,乱的一逼,每天辗转于公司和家...

  • 姑苏园林打酱油

    机票 祥鹏航空 赣州~杭州 来回881 杭州~苏州 高铁 来回220 保险 全年航意险 住宿 观前街 256 门票...

网友评论

      本文标题:出差来回机票钱最少

      本文链接:https://www.haomeiwen.com/subject/oyslaltx.html