611. 有効な三角形の数
611. 有効な三角形の数https://leetcode.cn/problems/valid-triangle-number/
タイトル説明:
非負の整数の配列を指定して nums
、三角形の辺を形成できるトリプルの数を返します。
問題解決のアイデア:
この問題は三角形が成り立つかどうかを問う問題です。まず、三角形の 3 つの辺 (a、b、c) があると仮定し、2 つの辺の和が 3 番目の辺より大きくなければなりません。
タイトルからわかるように、数値の順序が狂っています。abc を 1 つずつ実験するとタイムアウトになります (時間計算量 O^3)。
ソートするときは、a<b<c であると仮定すると、a+b>c が true かどうかを判断するだけで済みます。
ここでは、各 c を (後ろから前に) 走査するので、時間計算量は N^2+NlogN、つまり N^2 になります。
問題解決コード:
class Solution {
public:
int triangleNumber(vector<int>& nums) {
sort(nums.begin(),nums.end());
//假设a<b<c
int num=0;
int n=nums.size();
for(int i=n-1;i>=2;i--)
{
int left=0;
int right=i-1;
while(left<right)
{
if(nums[left]+nums[right]>nums[i])
{
num+=(right-left);
right--;
}
else
{
left++;
}
}
}
return num;
}
};
ソードはオファー 57 を指します。合計が s となる 2 つの数字
剣はオファー 57 を指します。合計が s となる 2 つの数字https://leetcode.cn/problems/he-wei-sde-liang-ge-shu-zi-lcof/
タイトル説明:
昇順にソートされた配列と数値 s を入力し、その合計が正確に s となる 2 つの数値を配列内で見つけます。複数の数値ペアの合計が s に等しい場合は、任意のペアを出力するだけです。
問題解決のアイデア:
まず、この質問は昇順配列です、ここで暴力を振るうとタイムアウトになります
ここではダブルポインタを使用し、1 つは左側の頭部を指し、もう 1 つは右側の尾部を指します。ここでは、左、右、ターゲットの間に 3 つの関係があります。
sub=right-left と仮定します。
最初のケースでは直接返すのは明らかですが、2 番目と 3 番目のケースを見てみましょう。
問題解決コード:
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
int n=nums.size();
int left=0;
int right=n-1;
while(nums[right]>target)
{
right--;
}
while(left<right)
{
int sub=target-nums[right];
if(sub==nums[left])
{
return {nums[left],nums[right]};
}
else if(sub>nums[left])
{
left++;
}
else//sub<nums[left]
{
right--;
}
}
return {-1,-1};
}
};