计算总和小于给定值的三元组的 Javascript 程序
原文:https://www . geeksforgeeks . org/JavaScript-程序对计数-三胞胎-总和小于给定值/
给定一组不同的整数和一个和值。查找总和小于给定总和值的三元组的计数。预期时间复杂度为 0(n2)。 例:
Input : arr[] = {-2, 0, 1, 3}
sum = 2.
Output : 2
Explanation : Below are triplets with sum less than 2
(-2, 0, 1) and (-2, 0, 3)
Input : arr[] = {5, 1, 3, 4, 7}
sum = 12.
Output : 4
Explanation : Below are triplets with sum less than 12
(1, 3, 4), (1, 3, 5), (1, 3, 7) and
(1, 4, 5)
一个简单的解决方案是运行三个循环来逐个考虑所有的三元组。对于每个三元组,如果三元组总和小于给定总和,则比较总和并增加计数。
java 描述语言
<script>
// A Simple Javascript program to count triplets with sum smaller
// than a given value
let arr = [5, 1, 3, 4, 7];
function countTriplets(n,sum)
{
// Initialize result
let ans = 0;
// Fix the first element as A[i]
for (let i = 0; i < n-2; i++)
{
// Fix the second element as A[j]
for (let j = i + 1; j < n-1; j++)
{
// Now look for the third number
for (let k = j + 1; k < n; k++)
if (arr[i] + arr[j] + arr[k] < sum)
ans++;
}
}
return ans;
}
// Driver method to test the above function
let sum = 12;
document.write(countTriplets(arr.length, sum));
// This code is contributed by avanitrachhadiya2155
</script>
输出:
4
上述解的时间复杂度为 O(n 3 )。一个高效解决方案可以先对数组进行排序,然后循环使用这个帖子的方法 1,来计数 O(n)2中的三胞胎。
1) Sort the input array in increasing order.
2) Initialize result as 0.
3) Run a loop from i = 0 to n-2\. An iteration of this loop finds all
triplets with arr[i] as first element.
a) Initialize other two elements as corner elements of subarray
arr[i+1..n-1], i.e., j = i+1 and k = n-1
b) Move j and k toward each other until they meet, i.e., while (j= sum
then k--
// Else for current i and j, there can (k-j) possible third elements
// that satisfy the constraint.
(ii) Else Do ans += (k - j) followed by j++
以下是上述想法的实现。
java 描述语言
<script>
// A Simple Javascript program to count triplets with sum smaller
// than a given value
let arr = [5, 1, 3, 4, 7];
function countTriplets(n,sum)
{
// Sort input array
arr.sort(function(a,b){return b-a});
// Initialize result
let ans = 0;
// Every iteration of loop counts triplet with
// first element as arr[i].
for (let i = 0; i < n - 2; i++)
{
// Initialize other two elements as corner elements
// of subarray arr[j+1..k]
let j = i + 1, k = n - 1;
// Use Meet in the Middle concept
while (j < k)
{
// If sum of current triplet is more or equal,
// move right corner to look for smaller values
if (arr[i] + arr[j] + arr[k] >= sum)
k--;
// Else move left corner
else
{
// This is important. For current i and j, there
// can be total k-j third elements.
ans += (k - j);
j++;
}
}
}
return ans;
}
// Driver method to test the above function
let sum = 12;
document.write(countTriplets(arr.length, sum));
// This code is contributed by rag2127
</script>
输出:
4
更多详情请参考计数总和小于给定值的三胞胎整篇文章!
版权属于:月萌API www.moonapi.com,转载请注明出处