Algorithm:523. 连续的子数组和
Review: 鸿蒙OS——安卓杀手
Tip/Tech:并查集
Share:印度会禁止使用部分一次性塑料
Algorithm
523. 连续的子数组和
https://leetcode-cn.com/problems/continuous-subarray-sum/
暴力法
原来以为这样不会通过的,但是没想到还是过了。
class Solution {
public boolean checkSubarraySum(int[] nums, int k) {
if (nums == null || nums.length < 2) {
return false;
}
for (int i = 0, len = nums.length; i < len - 1; ++i) {
int sumTemp = nums[i];
for (int j = i + 1; j < len; ++j) {
sumTemp += nums[j];
if (k != 0 && sumTemp % k == 0 ) {
return true;
} else if (k == 0 && sumTemp == 0) {
return true;
}
}
}
return false;
}
}
时间复杂度为
O
(
N
2
)
O(N^2)
O(N2)。这都能过了,简直了。。哈哈
哈希表
这里引用网友的解题思路:https://leetcode-cn.com/problems/continuous-subarray-sum/solution/lian-xu-de-zi-shu-zu-qiu-he-by-lenn123/
在方法一中我们利用前缀和数组来求解问题,对于子数组
n
u
m
s
[
i
:
j
]
nums[i:j]
nums[i:j] (不包含下标 j ),其区间和为
s
u
m
[
j
]
−
s
u
m
[
i
]
sum[j] - sum[i]
sum[j]−sum[i] (其中 sum 为预处理得到的前缀和数组),
我们要判断的是
(
s
u
m
[
j
]
−
s
u
m
[
i
]
)
%
k
(sum[j] - sum[i])\%k
(sum[j]−sum[i])%k 是否等于 0。
根据 mod 运算的性质,我们知道
(
s
u
m
[
j
]
−
s
u
m
[
i
]
)
%
k
=
s
u
m
[
j
]
%
k
−
s
u
m
[
i
]
%
k
(sum[j] - sum[i])\%k = sum[j]\%k - sum[i]\%k
(sum[j]−sum[i])%k=sum[j]%k−sum[i]%k
故若想
(
s
u
m
[
j
]
−
s
u
m
[
i
]
)
%
k
=
0
(sum[j] - sum[i])\%k = 0
(sum[j]−sum[i])%k=0,则必有
s
u
m
[
j
]
%
k
=
s
u
m
[
i
]
%
k
sum[j]\%k = sum[i]\%k
sum[j]%k=sum[i]%k。
但是思路是思路,要用代码实现还是有难度的,主要是判断0的情况。一般是实现倒是问题不大。
class Solution {
public boolean checkSubarraySum(int[] nums, int k) {
if (nums == null || nums.length < 2) {
return false;
}
if (k == 0) {
for (int i = 0, len = nums.length; i < len - 1; ++i) {
if (nums[i] == 0 && nums[i + 1] == 0) {
return true;
}
}
return false;
}
HashMap<Integer, Integer> map = new HashMap<>();
map.put(0, -1);
int sum = 0;
for (int i = 0, len = nums.length; i < len; ++i) {
sum += nums[i];
sum = sum % k;
if (map.containsKey(sum)) {
if (i - map.get(sum) > 1) {
return true;
}
} else {
map.put(sum, i);
}
}
return false;
}
}
Review
https://raccoon.onyxbits.de/blog/harmony-os-the-android-killer/
Harmony OS - the Android Killer?
鸿蒙OS——安卓杀手?
文章分析了一些目前安卓和鸿蒙OS的情况。
其中分析到,其实以上的图中,其实只有第一层谷歌的服务是谷歌自己独有的,下面的两层都是开源的。
文章也建议,鸿蒙OS要取代其实要花最大的力气也是取代第一层。
至于剩下两个其实不直接用就行了。
但是偏偏是第一层是最难以取代的,因为第一层其实是谷歌的生态,你无法想象你在国外不能是使用谷歌的play,那是国外安卓系统上的最多的应用的下载起始点;gmail邮箱就不用说了,这几乎是外国人的标配;youtube要是视频都看不了,那么玩手机还玩啥;map,谷歌地图,这个就更不用说了,谷歌在国外这方面几乎无敌。
所以以上这些服务才是android系统的重中之重。
Tip/Tech
通用的并查集的实现是通过map来搞定的,几乎成了万能的并查集实现。
并查集的实现
public class UnionFindSet<V> {
class Element<V> {
public V value;
public Element(V value) {
this.value = value;
}
}
public HashMap<V, Element<V>> elementHashMap;
public HashMap<Element<V>, Element<V>> fatherMap;
public HashMap<Element<V>, Integer> rankMap;
/**
* @Description: 初始化操作
* @Param: [list]
* @return:
* @Author: James
* @Date:
*/
public UnionFindSet(List<V> list) {
elementHashMap = new HashMap<>();
fatherMap = new HashMap<>();
rankMap = new HashMap<>();
for (V value : list) {
Element<V> element = new Element<>(value);
elementHashMap.put(value, element);
fatherMap.put(element, element);
rankMap.put(element, 1);
}
}
private Element<V> findHead(Element<V> element) {
Stack<Element<V>> path = new Stack<>();
// 找父节点
while (element != fatherMap.get(element)) {
path.push(element);
element = fatherMap.get(element);
}
// 路径压缩
while (!path.isEmpty()) {
fatherMap.put(path.pop(), element);
}
return element;
}
public boolean isSameSet(V a, V b) {
if (elementHashMap.containsKey(a) && elementHashMap.containsKey(b)) {
return findHead(elementHashMap.get(a)) == findHead(elementHashMap.get(b));
}
return false;
}
/**
* @Description: 合并两个两个数值所在的结合
* @Param: [a, b]
* @return: void
* @Author: James
* @Date: 2019/5/19
*/
public void union(V a, V b) {
if (elementHashMap.containsKey(a) && elementHashMap.containsKey(b)) {
Element<V> aF = findHead(elementHashMap.get(a));
Element<V> bF = findHead(elementHashMap.get(b));
// 若相同就表示已经在一个集合中了
if (aF != bF) {
// Element<V> big = rankMap.get(aF) >= rankMap.get(bF) ? aF : bF;
// Element<V> small = big == aF ? bF : aF;
Element<V> big = aF;
Element<V> small = bF;
if (rankMap.get(aF) < rankMap.get(bF)) {
big = bF;
small = aF;
}
fatherMap.put(small, big);
rankMap.put(big, rankMap.get(aF) + rankMap.get(bF));
rankMap.remove(small);
}
}
}
}
Share
https://www.ndtv.com/india-news/pm-narendra-modi-says-at-un-climate-meet-that-like-india-even-world-should-say-goodbye-to-single-use-2097878
India Will Ban Single-Use Plastic, World Should Too: PM Modi At UN Meet
莫迪总理在联合国会议上:印度将禁止一次性塑料,世界也应该禁止
印度即将在圣雄甘地诞辰10月2日之前在全国范围内禁止使用六种塑料制品。这六个物品是塑料袋,杯子,盘子,小瓶,吸管和某些类型的香囊。
环境问题已经成为了不管是发达国家还是发展中国家不得不面对的一个问题。
包括今年的上海的垃圾分类。还是印度今年的禁止使用塑料产品都表现了各国对改良环境的努力。
其实垃圾分类是肯定会在全国范围内施行的。