最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

利用Java實(shí)現(xiàn)和可被K整除的子數(shù)組完整實(shí)例

 更新時間:2024年01月23日 11:17:52   作者:楠枬  
這篇文章主要給大家介紹了關(guān)于利用Java實(shí)現(xiàn)和可被K整除的子數(shù)組的相關(guān)資料,這道題來自力扣,通過學(xué)習(xí)這道題的解題思路以及代碼對大家的學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

一、題目描述

給定一個整數(shù)數(shù)組 nums 和一個整數(shù) k ,返回其中元素之和可被 k 整除的(連續(xù)、非空) 子數(shù)組 的數(shù)目。

子數(shù)組 是數(shù)組的 連續(xù) 部分。

示例:

輸入:nums = [4,5,0,-2,-3,1],k = 5

輸出:7

輸入:nums = [ 5 ],k = 9

輸出:0

二、題解

思路分析

首先我們很容易想到暴力枚舉的方法,即遍歷數(shù)組,在遍歷每個元素的同時向后尋找元素之和能夠被k整除的子數(shù)組

暴力枚舉代碼如下:

class Solution {
    public int subarraysDivByK(int[] nums, int k) {
       int ret = 0;
       for(int i = 0; i < nums.length; i++){
           int sum = 0;
           for(int j = i; j < nums.length; j++){
               sum += nums[j];
               if(sum % k == 0){
                   ret++;
               }
           }
       }
       return ret;
    }
}

其時間復(fù)雜度為O(N^{2}),當(dāng)輸入的nums數(shù)組較大時,會超出時間限制,因此,暴力枚舉方式行不通,我們繼續(xù)考慮其他方法

題目中要求我們找到元素之和可被k整除的(連續(xù)、非空)子數(shù)組,因此我們可以想到使用雙指針的思路,即考慮使用滑動窗口來解決這個問題,然而,本題不能使用滑動窗口來解決

為什么不能使用滑動窗口?

參照示例1,其輸入的數(shù)組 nums = [4,5,0,-2,-3,1],其中不僅有正整數(shù),還有零和負(fù)數(shù),

在使用滑動窗口時,當(dāng)窗口內(nèi)元素滿足條件時,要移動left指針,向前滑動窗口,但在本題中,由于有零和負(fù)整數(shù),在窗口內(nèi)元素滿足條件時,不能移動left指針,因?yàn)橄乱粋€元素可能是零,加入后任滿足條件,也可能幾個元素相加等于0,加入后也滿足條件。因此,若是使用滑動窗口來解決本題,則會漏掉一些符合情況的子數(shù)組。

滑動窗口的思路也不行,我們繼續(xù)思考新的方法,在涉及子數(shù)組問題時,我們也常使用前綴和來解決問題

什么是前綴和?

前綴和即某序列的前n項(xiàng)和,類似于數(shù)學(xué)中的數(shù)列前n項(xiàng)和。即從首元素位置到i位置這個區(qū)間內(nèi)所有元素之和,前綴和只是一種思路,其不僅可以求和,也可以求從首元素位置到i位置區(qū)間內(nèi)的乘積等等。

我們以示例1為例子,先求前綴和數(shù)組,再通過前綴和數(shù)組來求解子數(shù)組,

然而,在這種情況下,當(dāng)我們求解子數(shù)組時,仍然需要后遍歷,求得從i到j(luò)位置的元素之和,再判斷其是否符合條件,

其時間復(fù)雜度仍是O(N^{2}

在通過前綴和數(shù)組求解子數(shù)組時,我們可以考慮向前遍歷,即i位置上的元素為到i位置的元素之和

N^{2}

此時,若以i位置為結(jié)尾的區(qū)間內(nèi)的元素能夠被被k整除,則

 此時dp[i] - dp[j] = mk,(m為系數(shù)),即dp[i]與dp[j]同余(dp[i]取余 k 與dp[j]取余 k 的余數(shù)相同)(兩數(shù)余數(shù)相同,在相減時就將余數(shù)消去,剩下的數(shù)便能整除k),此時,我們只需要找到,在i位置之前有多少個前綴和元素的余數(shù)與其前綴和相同,就能夠得到以i位置為結(jié)尾的且能夠被k整除的子數(shù)組個數(shù)。

然而,在求i位置之前有多少個前綴和元素的余數(shù)與其相同時,我們還需要再向前遍歷一遍前綴和數(shù)組嗎?

我們可以使用哈希表,存儲前綴和元素的余數(shù)及其個數(shù),這樣,便只需要計(jì)算dp[i]的余數(shù),再從哈希表中找到相同余數(shù)的元素個數(shù),就可知道以i位置為結(jié)尾的且能夠被k整除的子數(shù)組個數(shù)了。

在分析完思路后,我們來考慮其具體實(shí)現(xiàn)過程:

具體實(shí)現(xiàn)

首先我們需要一個哈希表,以前綴和元素模k的值為鍵,值的個數(shù)為值

// key:模k的的值,value:key的個數(shù)
Map&lt;Integer, Integer&gt; hash = new HashMap&lt;&gt;();

需要注意的是,在模k時,如果元素為負(fù)數(shù),求出的值也為負(fù)數(shù)(例如 -4 % 5 = -4,-4 與 1 是同余的,若我們在哈希表中保存(-4, 1),而 % i的結(jié)果為 1,并在哈希表中找到結(jié)果為1的元素個數(shù),此時就漏掉了結(jié)果 為 -4 的情況),

因此我們需要對其進(jìn)行處理,將其變?yōu)檎龜?shù),可以將其+k,使其變成正數(shù),即 dp[i] % k + k(-4 + 5 = 1);當(dāng)其為正數(shù)的時候則不需要 +k,若想要無需對元素進(jìn)行正負(fù)數(shù)判斷,則可在 +k 后再取余k,即 (dp[i] % k + k) % k,此時,若元素為正數(shù),在 +k 后結(jié)果大于k,再對結(jié)果進(jìn)行取余,又將其變?yōu)檎_結(jié)果((3 % 5 + 5)% 5);若元素為負(fù)數(shù),在 +k 后將負(fù)數(shù)變?yōu)檎龜?shù),即正確結(jié)果,再對結(jié)果進(jìn)行取余,仍是正確結(jié)果((-4 % 5 + 5)% 5)

求出數(shù)組的前綴和數(shù)組

由于哈希表中保存的是模k的值及其個數(shù),因此我們不需要再創(chuàng)建一個前綴和數(shù)組用來保存前綴和,只需使用變量sum 來保存前i-1個元素的和

何時將結(jié)果放到哈希表中?

我們要從哈希表中找到相同余數(shù)的元素個數(shù),從而知道以i位置為結(jié)尾的且能夠被k整除的子數(shù)組個數(shù),因此哈希表中不能存放i位置之后的元素結(jié)果,因此,每遍歷一個元素,就將其結(jié)果更新到哈希表中

然而,此時還有一個細(xì)節(jié)問題

若以i位置為結(jié)尾的數(shù)組本身便能被k整除,此時模k的結(jié)果為 0,即從0位置到i位置的子數(shù)組之和能夠被k整除,則在第一次出現(xiàn)該情況時,哈希表內(nèi)沒有key = 0的元素,會漏掉該結(jié)果,因此,我們需要處理這種特殊情況,即手動將(0, 1)放入哈希表中

完整代碼

class Solution {
    public int subarraysDivByK(int[] nums, int k) {
        // key:模k的的值,value:key的個數(shù)
       Map<Integer, Integer> hash = new HashMap<>();
       //處理特殊情況
        hash.put(0,1);
        int ret = 0;//子數(shù)組的個數(shù)
        int sum = 0;//用來保存前i-1個元素之和
        for(int i = 0; i < nums.length; i++){
            sum += nums[i];
            //求出與 前i個元素之和 同余的元素個數(shù)
            int same = hash.getOrDefault((sum % k + k) % k, 0);
            ret += same;//更新結(jié)果
            hash.put((sum % k + k) % k,same + 1);//更新哈希表
        }
        return ret;
    }
}

題目來自:

974. 和可被 K 整除的子數(shù)組 - 力扣(LeetCode)

總結(jié)

到此這篇關(guān)于利用Java實(shí)現(xiàn)和可被K整除的子數(shù)組的文章就介紹到這了,更多相關(guān)Java和可被K整除的子數(shù)組內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:

相關(guān)文章

  • SpringBoot中定制異常頁面的實(shí)現(xiàn)方法

    SpringBoot中定制異常頁面的實(shí)現(xiàn)方法

    這篇文章主要介紹了SpringBoot中定制異常頁面的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • spring中的特殊注解@RequiredArgsConstructor詳解

    spring中的特殊注解@RequiredArgsConstructor詳解

    這篇文章主要介紹了spring中的特殊注解@RequiredArgsConstructor,包括注解注入,構(gòu)造器注入及setter注入,結(jié)合示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-04-04
  • Java打印高質(zhì)量日志的10條方法詳解

    Java打印高質(zhì)量日志的10條方法詳解

    你以為打日志是小事,也許正是這種輕視,讓你在凌晨三點(diǎn)被生產(chǎn)事故電話吵醒,一個優(yōu)秀的工程師和普通碼農(nóng)的區(qū)別,往往體現(xiàn)在那些看似微不足道的細(xì)節(jié)上,下面我們就來看看如何打印高質(zhì)量日志吧
    2025-06-06
  • Spring框架中的@Conditional系列注解詳解

    Spring框架中的@Conditional系列注解詳解

    這篇文章主要介紹了Spring框架中的@Conditional系列注解詳解,我們需要一個類實(shí)現(xiàn)Spring提供的Condition接口,它會匹配@Conditional所符合的方法,然后我們可以使用我們在@Conditional注解中定義的類來檢查,需要的朋友可以參考下
    2024-01-01
  • 不可不知道的10個java謊言

    不可不知道的10個java謊言

    這篇文章主要為大家詳細(xì)介紹了不可不知道的10個java謊言,大家一定要謹(jǐn)慎,需要了解的朋友可以參考一下
    2016-09-09
  • Java 數(shù)據(jù)庫連接池 Tomcat介紹

    Java 數(shù)據(jù)庫連接池 Tomcat介紹

    這篇文章主要給大家分享了 Java 數(shù)據(jù)庫連接池 Tomcat介紹,omcat 是一個小型的輕量級應(yīng)用服務(wù)器,在中小型系統(tǒng)和并發(fā)訪問用戶不是很多的場合下被普遍使用,是開發(fā)和調(diào)試JSP 程序的首選。下面來看看文章內(nèi)容的詳細(xì)介紹吧
    2021-11-11
  • java僅用30行代碼就實(shí)現(xiàn)了視頻轉(zhuǎn)音頻的批量轉(zhuǎn)換

    java僅用30行代碼就實(shí)現(xiàn)了視頻轉(zhuǎn)音頻的批量轉(zhuǎn)換

    這篇文章主要介紹了java僅用30行代碼就實(shí)現(xiàn)了視頻轉(zhuǎn)音頻的批量轉(zhuǎn)換,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • 一文帶你掌握J(rèn)ava?ReentrantLock加解鎖原理

    一文帶你掌握J(rèn)ava?ReentrantLock加解鎖原理

    這篇文章將為大家詳細(xì)介紹一下Java中ReentrantLock?加鎖和釋放鎖的原理,以及和?Synchronized?的對比。文中的示例代碼講解詳細(xì),希望對大家有所幫助
    2022-12-12
  • java工具類static靜態(tài)方法讀取yml配置過程

    java工具類static靜態(tài)方法讀取yml配置過程

    文章介紹了在工具類中獲取YAML配置時遇到的問題,由于變量是靜態(tài)的,而Spring加載靜態(tài)方法比IOC容器早,導(dǎo)致無法直接使用@Value注解讀取YAML配置,從而讀取結(jié)果為null
    2024-11-11
  • IDEA 2020.1.1好用的plugins插件推薦

    IDEA 2020.1.1好用的plugins插件推薦

    這篇文章主要介紹了IDEA 2020.1.1好用的plugins插件推薦,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07

最新評論

巴彦淖尔市| 红原县| 金坛市| 天津市| 阿坝县| 溆浦县| 新河县| 天门市| 弋阳县| 紫阳县| 西城区| 雅江县| 高青县| 视频| 兴仁县| 荆州市| 寻乌县| 高碑店市| 苏尼特左旗| 吉水县| 临泽县| 龙岩市| 诸城市| 竹山县| 东莞市| 麦盖提县| 沭阳县| 蒙山县| 开远市| 闻喜县| 洪湖市| 葫芦岛市| 龙门县| 汤阴县| 会理县| 昭通市| 梓潼县| 武宣县| 逊克县| 桓仁| 鸡东县|