1. 有效三角形的个数
给定一个包含非负整数的数组 nums ,返回其中可以组成三角形三条边的三元组个数。
示例 1:
输入: nums = [2,2,3,4] 输出: 3 解释:有效的组合是: 2,3,4 (使用第一个 2) 2,3,4 (使用第二个 2)
2,2,3 示例 2:输入: nums = [4,2,3,4] 输出: 4
题解:利用单调性(单调递增)和双指针快速统计三元组个数。这里是利用单调性是指按照升序后一个数据的值是大于前一个数据的。
- 首先固定数组中最大的数。
- 在最大的数的左半边区间使用双指针算法,快速统计符合要求的三元组个数。
如图:
class Solution {
public:
int triangleNumber(vector<int>& nums) {
sort(nums.begin(),nums.end());//优化数组
int size = nums.size();
int count = 0;
for(int i =size-1;i>=2;i--)
{
int left = 0;
int right = i-1;
while(left <right)
{
if(nums[left]+nums[right]>nums[i])
{
count += right-left;
right--;
}
else
{
left++;
}
}
}
return count;
}
};
时间复杂度为: O(N2)
2. 查找总价格为目标值的两个商品
购物车内的商品价格按照升序记录于数组 price。请在购物车中找到两个商品的价格总和刚好是 target。若存在多种情况,返回任一结果即可。
示例 1:
输入:price = [3, 9, 12, 15], target = 18 输出:[3,15] 或者 [15,3] 示例 2:
输入:price = [8, 21, 27, 34, 52, 66], target = 61 输出:[27,34] 或者 [34,27]
提示:
1 <= price.length <= 10^5 1 <= price[i] <= 10^6 1 <= target <= 2*10^6
题解: 这道题目也是利用单调性和双指针算法来解决。
思路:
1.首先使用双指针第一个(left)指向数组开始第二个(right)指向数组的结尾。
2.若两个指针指向数据值的和(sum) 大于target,则right–
3.若sum小于target, 则 left++
4. 若是 sum= target ,则返回结果
class Solution {
public:
vector<int> twoSum(vector<int>& price, int target) {
int size = price.size();
int left = 0;
int right = size-1;
while(left<right)
{
int sum = price[left] + price[right];
if(sum > target)
right--;
else if(sum<target)
left++;
else
return {price[left],price[right]};
}
return {-1,-1};
}
};
时间复杂度为: O(N)