2022.7.3

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;
}

在这里插入图片描述

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

0x0c……

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值