国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

面試算法35:最小時間差

這篇具有很好參考價值的文章主要介紹了面試算法35:最小時間差。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

題目

給定一組范圍在00:00至23:59的時間,求任意兩個時間之間的最小時間差。例如,輸入時間數(shù)組[“23:50”,“23:59”,“00:00”],"23:59"和"00:00"之間只有1分鐘的間隔,是最小的時間差。

分析

這個題目最直觀的解法是求出任意兩個時間的間隔,然后比較得出最小的時間差。如果輸入n個時間,那么需要計(jì)算每個時間與另外n-1個時間的間隔,這種蠻力法需要O(n2)的時間。

上述解法的一個優(yōu)化方法是把n個時間排序。排序之后只需要計(jì)算兩兩相鄰的時間之間的間隔,這樣就只需要計(jì)算O(n)個時間差。由于對n個時間進(jìn)行排序通常需要O(nlogn)的時間,因此這種優(yōu)化算法的總體時間復(fù)雜度是O(nlogn)。

這里有一個特殊情況值得注意。如果把輸入的時間數(shù)組[“23:50”,“23:59”,“00:00”]排序,就可以得到[“00:00”,“23:50”,“23:59”]。時間00:00和23:50之間的間隔是1430分鐘,而23:50和23:59之間的間隔是9分鐘。由于排序之后的第1個時間00:00也可能是第2天的00:00,它和前一天的23:59之間的間隔只有1分鐘。也就是說,在計(jì)算最小時間差時,需要把排序之后的第1個時間當(dāng)作第2天的時間(即加上24小時)與最后一個時間之間的間隔也考慮進(jìn)去。

接著思考如何做進(jìn)一步優(yōu)化。前面的算法主要將時間花在排序上面,那么排序是否可以避免?排序是為了計(jì)算相鄰的兩個時間的節(jié)點(diǎn),所以用一個表示時間的數(shù)組也可以達(dá)到這個目的。

一天有24小時,即1440分鐘。如果用一個長度為1440的數(shù)組表示一天的時間,那么數(shù)組下標(biāo)為0的位置對應(yīng)時間00:00,下標(biāo)為1的位置對應(yīng)時間00:01,以此類推,下標(biāo)為1439的位置對應(yīng)23:59。數(shù)組中的每個元素是true或false的標(biāo)識,表示對應(yīng)的時間是否存在于輸入的時間數(shù)組中。

有了這個輔助數(shù)組,就只需要從頭到尾掃描一遍,相鄰的兩個為true的值表示對應(yīng)的兩個時間在輸入時間數(shù)組中是相鄰的。例如,輸入時間數(shù)組[“23:50”,“23:59”,“00:00”],數(shù)組中只有下標(biāo)為0、1430和1439這3個位置的值為true,其他位置的值都是false。

由于數(shù)組的下標(biāo)對應(yīng)的是時間,因此兩個時間之間的時間差就是它們在數(shù)組中對應(yīng)的下標(biāo)之差。23:50和23:59之間相隔9分鐘,它們在數(shù)組中的下標(biāo)之差也是9。文章來源地址http://www.zghlxwxcb.cn/news/detail-740849.html

public class Test {
    public static void main(String[] args) {
        List<String> timePoints = Arrays.asList("23:50", "23:59", "00:00");
        int result = findMinDifference(timePoints);
        System.out.println(result);
    }

    public static int findMinDifference(List<String> timePoints) {
        if (timePoints.size() > 1440) {
            return 0;
        }

        boolean[] minuteFlags = new boolean[1440];
        for (String time : timePoints) {
            String[] t = time.split(":");
            int min = Integer.parseInt(t[0]) * 60 + Integer.parseInt(t[1]);
            if (minuteFlags[min]) {
                return 0;
            }

            minuteFlags[min] = true;
        }

        return helper(minuteFlags);
    }

    private static int helper(boolean[] minuteFlags) {
        int minDiff = minuteFlags.length - 1;
        int prev = -1;
        int first = minuteFlags.length - 1;
        int last = -1;
        for (int i = 0; i < minuteFlags.length; i++) {
            if (minuteFlags[i]) {
                if (prev >= 0) {
                    minDiff = Math.min(i - prev, minDiff);
                }

                prev = i;
                first = Math.min(i, first);
                last = Math.max(i, last);
            }
        }

        minDiff = Math.min(first + minuteFlags.length - last, minDiff);
        return minDiff;
    }
}

到了這里,關(guān)于面試算法35:最小時間差的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • shell腳本計(jì)算時間差

    https://www.cnblogs.com/abclife/p/15828229.html

    2024年02月11日
    瀏覽(32)
  • Excel如何計(jì)算時間差

    Excel如何計(jì)算時間差

    =HOUR(B1-A1)\\\"小時 \\\"MINUTE(B1-A1)\\\"分鐘 \\\"SECOND(B1-A1)\\\"秒\\\"

    2024年04月23日
    瀏覽(24)
  • 解決時間差太大導(dǎo)致Windows無法同步時間

    按微軟文檔進(jìn)入注冊表修改: HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesW32TimeConfig MaxPosPhaseCorrection和MaxNegPhaseCorrection為:0xffffffff (8個F) 但是發(fā)現(xiàn)W32TimeConfig里面是空的,而且無法創(chuàng)建 查看config目錄權(quán)限,發(fā)現(xiàn)權(quán)限丟失,重新繼承權(quán)限后修改成功。 另外設(shè)置同步時間間隔

    2024年02月16日
    瀏覽(20)
  • LocalDate、LocalDateTime計(jì)算時間差

    LocalDate、LocalDateTime計(jì)算時間差

    LocalDateTime計(jì)算天數(shù)和時間差 以下是Jdk1.7存在的問題以及Jdk1.8新特性 Jdk1.7的問題 ??在Jdk1.8版本發(fā)布了新的Date-Time API來加強(qiáng)對時間、日期的處理。這是因?yàn)樵贘dk1.7中時間、日期的處理上存在如下的一些問題。 非線程安全。Date類是非線程安全的,這是Java時間日期類中最大的

    2023年04月15日
    瀏覽(29)
  • Java計(jì)算時間差、日期差

    在java中,計(jì)算時間差或日期差有多種方法,以下提供五種示例: 目錄 一、使用?Instant?和?Duration?類計(jì)算時間差 二、使用?LocalDate?和?ChronoUnit?類計(jì)算日期差 三、使用 Joda-Time 庫計(jì)算時間差和日期差 四、使用?Instant?和?Period?類計(jì)算日期差 五、使用 Java 8 的?java.time.tempo

    2024年02月14日
    瀏覽(28)
  • 【hive 】時間差(天、小時、分、秒)和常用時間格式轉(zhuǎn)

    unix_timestamp()是hive系統(tǒng)時間,格式是timestamp,精確到秒。 unix_timestamp(ymdhms)是把時間轉(zhuǎn)換成timestamp格式,是2018-05-23 07:15:50格式。 unix_timestamp() - unix_timestamp(ymdhms)是兩個時間轉(zhuǎn)換為timestamp之后相減,timestamp單位是秒,相減之后是兩個時間之間相差的秒數(shù)。 CAST((unix_timestamp() - un

    2024年02月03日
    瀏覽(24)
  • mysql 日期 計(jì)算 時間差 天數(shù)差

    第一種:TIMESTAMPDIFF函數(shù) 三個參數(shù)。第一個參數(shù)是比較的類型: FRAC_SECOND、SECOND、 MINUTE、 HOUR、 DAY 、 WEEK 、 MONTH 、 QUARTER、 YEAR 幾種類型。第二、三參數(shù)是時間, 后減前 : 第二種: DATEDIFF函數(shù) 兩個參數(shù)。前減后。得到相差的天數(shù)。 NOW() 當(dāng)前的年月日時分秒,如:2023-03-09

    2024年02月07日
    瀏覽(34)
  • Java計(jì)算Date類時間差

    在Java中,我們可以使用Date類來表示日期和時間。如果我們想要計(jì)算兩個日期之間的時間差,我們可以使用以下步驟: 創(chuàng)建兩個Date對象,表示要比較的兩個日期。 使用getTime()方法獲取每個Date對象的時間戳。 計(jì)算兩個時間戳之間的差值,以毫秒為單位。 將毫秒轉(zhuǎn)換為所需的

    2024年02月15日
    瀏覽(40)
  • STM32測相位差(根據(jù)時間差)

    STM32測相位差(根據(jù)時間差)

    ?????????兩路方波輸入到stm32的兩路定時器通道,通過檢測高電平到來的時間差從而算出相位差, 公式? 相位差=360*頻率*(時間差) ? ? ? ? 如果要測正弦波,可以通過電壓比較電路轉(zhuǎn)為方波 ???????? 定時器初始化及定時器中斷代碼: 在主程序中求其中一路信號的

    2024年02月16日
    瀏覽(21)
  • 數(shù)據(jù)存入es 時間差了8個小時

    數(shù)據(jù)存入es 時間差了8個小時

    ?Mysql ?這種現(xiàn)象其實(shí)是正常的,因?yàn)閑s默認(rèn)存儲時間的格式是UTC時間,我們一般用的是UTC+8 存入Es后應(yīng)該是在原來的基礎(chǔ)上(UTC+8)-8=UTC 存入到Es后就變成我們看到的樣子了 首先知道幾個時間名詞: (1)GMT:格林威治標(biāo)準(zhǔn)時間 (2)UTC:世界協(xié)調(diào)時間 (3)DST:夏日節(jié)約時間 (

    2024年02月02日
    瀏覽(18)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包