1.简单的二分法。
class Solution {
public:
int search(vector<int>& nums, int target) {
int n=nums.size();
int left = 0,right=n-1;
while(left<=right){
int mid=left-(left-right)/2;
if(target==nums[mid]){
return mid;
}
else if(target>nums[mid]){
left=mid+1;
}else{
right=mid-1;
}
}
return -1;
}
};
2.排序后遍历,暴力求解,创建空的数组存放满足条件的值,不存在满足条件的值则返回的空列表。
class Solution {
public:
vector<int> targetIndices(vector<int>& nums, int target) {
sort(nums.begin(),nums.end());
int n=nums.size();
vector<int>v;
for(int i=0;i<n;i++){
if(target==nums[i]){
v.emplace_back(i);
}
}
return v;
}
};
3.用类似环形链表的方法,用快慢指针,把slow,fast的操作看作next操作,找到环的入口,再让slow和fast以相同的速度相遇,就是目标值。
class Solution {
public:
int findDuplicate(vector<int>& nums) {
int slow=0,fast=0;
do{
slow=nums[slow];
fast=nums[nums[fast]];
}while(fast!=slow);
slow=0;
while(slow!=fast){
slow=nums[slow];
fast=nums[fast];
}
return slow;
}
};
4.不太会,参考大佬们的。
#include<bits/stdc++.h>
using namespace std;
const int N = 1e7;
int a[N];
int main()
{
int T;
scanf("%d",&T);
while(T--) {
int n,s;
scanf("%d%d",&n,&s);
int l = 1, r = 1;
int ans = 1e9;
for(int i = 1; i <= n; i++) {
scanf("%d",&a[i]);
}
int sum = 0;
for(int i = 1; i <= n; i++) {
sum += a[i];
}
if(sum < s)
{
printf("-1\n");
continue;
}
sum = a[1];
while(l <= n && r <= n) {
if(sum == s)
{
ans = min(l - 1 + n - r, ans);
r++;
sum += a[r];
}
else if(sum > s) {
sum -= a[l];
l++;
}
else
{
r++;
sum += a[r];
}
}
printf("%d\n",ans);
}
return 0;
}