Algorithm
leetcode 976. Largest Perimeter Triangle
Given an array A of positive lengths, return the largest perimeter of a triangle with non-zero area, formed from 3 of these lengths.
If it is impossible to form any triangle of non-zero area, return 0.
Example 1:
Input: [2,1,2]
Output: 5
Example 2:
Input: [1,2,1]
Output: 0
Example 3:
Input: [3,2,3,4]
Output: 10
Example 4:
Input: [3,6,2,3]
Output: 8
Note:
3 <= A.length <= 10000
1 <= A[i] <= 10^6
许久没刷题了,感觉脑子有点锈了。逻辑思维一直是我的短板,应该努力的去克服。
class Solution {
public int largestPerimeter(int[] A) {
if (A == null || A.length < 3) return 0;
int len = A.length;
Arrays.sort(A);
for (int i = len - 1; i > 1; i--) {
//如果A[i] >= A[i-1] + A[i-2] 那么 A[i] >= A[i-2] + A[i-3], 所以只要找到第一个由三条最大边组成的三角形,即可以确定。
if (A[i] < A[i - 1] + A[i - 2]) {
return A[i] + A[i - 1] + A[i - 2];
}
}
return 0;
}
}
Review
Tip
Share
- 由于CPU和主存速度差别较大,所以在两者中间引入了多层高速缓存(L1、L2、L3),在多核计算机中有多个CPU,会造成数据不一致。所以引入了内存模型。
- 通常有两种方案解决。
- 通过在总线加LOCK#锁的方式
在早期CPU中使用。CPU和其他部件进行通信都是通过总线来进行的,对总线加LOCK#锁,使得只能有一个CPU访问变量的内存。 - 通过缓存一致性协议
intel的MESI协议:当CPU写数据时,如果操作的变量是共享变量,会发出信号通知其他CPU将该变量的缓存行置为无效状态,其他CPU在访问时,就会从主存中重新读取。
MESI协议的理解
- 通过在总线加LOCK#锁的方式
缓存一致性:解决多个缓存副本之间的一致性问题,确保在CPU对共享变量修改之后,可以对其他CPU立即可见。指并发编程中的可见性。
内存一致性:解决多个线程之间的一致性问题,确保每个线程可以获取到正确的结果。指并发编程中的原子性、有序性、可见性。