left == right
|| left > right
。数组划分,根据某种规则将数组分为不同性质的两块。 这道题中用 l,r 维护一段区间,区间内全都是0。也就是说 l 始终指向的数字就是0。
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int l = 0, r = 0;
while (r < nums.size())
{
if (nums[r]) swap(nums[r], nums[l++]);
r++;
}
}
};
类似链表中带环的问题,当快慢指针相遇时入环。
class Solution {
public:
int func(int m)
{
int sum = 0;
while (m)
{
sum += pow(m % 10, 2);
m /= 10;
}
return sum;
}
bool isHappy(int n) {
int slow = n, fast = func(n);
while (slow != fast)
{
slow = func(slow);
fast = func(func(fast));
}
return slow == 1;
}
};
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n, x;
cin >> n >> x;
vector<int> a(n + 1);
for (int i = 1; i <= n; i++)
cin >> a[i];
int left = -1, right = -1, sum = 0, len = INT_MAX;
for (int l = 1, r = 1; r <= n; r++)
{
sum += a[r]; // 1.进窗口
while (sum >= x) // 2.判断
{
if (r - l + 1 < len)
{
// 3.更新结果
left = l, right = r;
len = right - left + 1;
}
sum -= a[l++]; // 4.出窗口
}
}
cout << left << " " << right << endl;
return 0;
}