数组和字符串-双指针

文章目录

        • 反转字符串
          • 题意:
          • 解:
          • 代码:
        • 数组拆分 I
          • 题意:
          • 解:
          • 代码:
        • 两数之和 II - 输入有序数组
          • 题意:
          • 解:
          • 代码:
        • 移除元素
          • 题意:
          • 解:
          • 代码:
        • 最大连续1的个数
          • 题意:
          • 解:
          • 代码:
        • 长度最小的子数组
          • 题意:
          • 解:
          • 代码:

反转字符串

题意:

如题

解:

经典双指针

代码:
#include
using namespace std;
void reverseString(vector& s)
{
    int l=0,r=s.size()-1;
    while(l s;
    string ss;cin>>ss;
    for(auto &ch:ss) s.push_back(ch);
    reverseString(s);
    for(auto &ch:s) cout<

数组拆分 I

题意:

一个长度2*n的数组,将其分为n组,每组两个数字,每组的值为两个数字较小中的一个,求n组和的最大值

解:

从小到大排序,遍历如果遇到一个没分组的数字,则它一定会成为一个组的值,那么另一个就应该挑选一个尽可能小的数字和它组队,既不改变这个组的值,又能把大的数字留给后面用

实际上就是取一个丢一个

双指针,我觉得考排序,或者n^2每次找最小值和次小值也行。写了一个不是很快的快排

代码:
#include
using namespace std;
void mySort(int l,int r,vector& nums)
{
    if(l>=r) return;
    int mao=l,ll=l+1,rr=r;
    while(ll<=rr)
    {
        while(rr>=ll && nums[rr]>nums[mao]) rr--;
        while(ll<=rr && nums[ll]<=nums[mao]) ll++;
        if(ll>=rr)
        {
            swap(nums[ll-1],nums[mao]);
            break;
        }
        else swap(nums[rr],nums[ll]);
    }
    mySort(l,ll-2,nums);mySort(ll,r,nums);
}
int arrayPairSum(vector& nums)
{
    int lg=nums.size(),ans=0;
    mySort(0,lg-1,nums);
    for(int i=0;i nums;int num;
    while(cin>>num) nums.push_back(num);
    int ans=arrayPairSum(nums);
    cout<

两数之和 II - 输入有序数组

题意:

在一个非递减数组中找到唯一的两个数字相加等于t,返回下标+1

解:

经典双指针

代码:
#include
using namespace std;
vector twoSum(vector& numbers, int target)
{
    int r=numbers.size()-1,l=0;
    while(ltarget) r--;
        else if(numbers[l]+numbers[r]>t;
    vector nums;int num;
    while(cin>>num) nums.push_back(num);
    vector ans=twoSum(nums,t);
    for(auto &a:ans) cout<

移除元素

题意:

将给定值移动到数组最后

解:

前后指针好做

代码:
#include
using namespace std;
int removeElement(vector& nums, int val)
{
    int len=0,lg=nums.size(),t1=0,t2=lg-1;
    while(t1<=t2)
    {
        while(t1<=t2 && nums[t1]!=val) t1++;//找最前面的需要删除的数字 
        while(t1<=t2 && nums[t2]==val) t2--;//找最前面的替换数字
        
        if(t1& nums, int val)
{
    int len=0,lg=nums.size(),t1=0,t2=0;
    while(t1>t;
    vector nums;int num;
    while(cin>>num) nums.push_back(num);
    int ans=removeElement(nums,t);
    cout<

最大连续1的个数

题意:

如题

解:

咳咳,感觉没必要双指针,直接算吧

代码:
#include
using namespace std;
int findMaxConsecutiveOnes(vector& nums)
{
    int ans=0,temp=0;
    for(auto& num:nums)
    {
        if(num) temp++;
        else
        {
            ans=max(temp,ans);
            temp=0;
        }
    }
    return max(ans,temp);
}
int main()
{
    vector nums;int num;
    while(cin>>num) nums.push_back(num);
    int ans=findMaxConsecutiveOnes(nums);
    cout<

长度最小的子数组

题意:

求和大于t的子数组的最小长度

解:

debug花了点时间

代码:
#include
using namespace std;
int minSubArrayLen(int target, vector& nums)
{
    int l=0,r=0,lg=nums.size(),sum=0,ans=INT_MAX;
    while(l=target) sum-=nums[l++];
        if(sum>=target)
        {
            ans=min(ans,r-l);
            sum-=nums[l++];
        }
        else break;
    }
    return (ans==INT_MAX)? 0 : ans;
}
int main()
{
    int t;cin>>t;
    vector nums;int num;
    while(cin>>num) nums.push_back(num);
    int ans=minSubArrayLen(t,nums);
    cout<

你可能感兴趣的:(力扣每日一题,算法,c++,数据结构,leetcode)