解法一 : 字首和的暴力搜尋(o(n^2) )
我們遍歷每乙個連續的序列, 判斷他是否滿足條件, 我們使用字首和(這種解法相信不用多說就會的)
public
boolean
checksubarraysum
(int
nums,
int k)
// 迴圈處理每一段連續的序列
for(
int i =
0; i < nums.length; i++)}
}return
false
;}
解法二: 這個思路非常巧妙, 我們直接說明實現方式 (o(n))時間複雜度
我們用乙個hashmap儲存, (sum %k, index) 這裡面的index是陣列下標, sum表示字首和, 到index下標的字首和, 為什麼我們需要這樣處理呢?我們來看乙個例子, k = 6
index 0 1 2 3 4
data 23 2 4 6 7
第一次新增進雜湊表是 (23 % 6, 0), 第二次 (((23 % 6) + 2) % 6, 1), 第三次 (((((23 % 6) + 2) % 6) + 4) % 6, 2) ,我們發現第三次的key跟第一次的key衝突了, 我們就認為 從第一次道第三次時中間有 2- 0個數的子串行符合題意。 為什麼呢?
加入我們在i的位置 字首和是res, 從這個數之後有長度為n的序列滿足條件, 所以到下標為i+ n 的時候 我們需要put什麼呢?(((res + n * k) % k), i + n), 算出來這個key明顯跟res相同, 所以中間就有n個數的序列滿足題意, 當n> 1時即可
public
boolean
checksubarraysum
(int
nums,
int k)
if(map.
containskey
(sum))}
else
}return
false
;}
LeetCode523 連續子陣列和
1 未考慮的情況 k 0的情況,一般涉及到 和 都要優先考慮到除數為0的情況。k 0且陣列中有連續兩個0的情況,返回true 雙層迴圈,複雜度 o n 2 package com.leetcode.dp public class leet523 system.out.println checksub...
Leetcode 523 連續的子陣列和
給定乙個包含非負數的陣列和乙個目標整數 k,編寫乙個函式來判斷該陣列是否含有連續的子陣列,其大小至少為 2,總和為 k 的倍數,即總和為 n k,其中 n 也是乙個整數。示例 1 輸入 23,2,4,6,7 k 6 輸出 true 解釋 2,4 是乙個大小為 2 的子陣列,並且和為 6。示例 2 輸...
LeetCode 523 連續的子陣列和
給定乙個包含非負數的陣列和乙個目標整數 k,編寫乙個函式來判斷該陣列是否含有連續的子陣列,其大小至少為 2,總和為 k 的倍數,即總和為 n k,其中 n 也是乙個整數。示例 1 輸入 23,2,4,6,7 k 6 輸出 true 解釋 2,4 是乙個大小為 2 的子陣列,並且和為 6。示例 2 輸...