力扣 算法题

121.买卖彩票的最佳时机

在这里插入图片描述

int maxProfit(int* prices, int pricesSize)
{
    int minprice = prices[0];
    int maxprofit = 0;
    for (int i = 0;i < pricesSize;i++)//一一遍历
    {
        if (minprice >= prices[i])
        {
            minprice = prices[i];
        }
        if (minprice<prices[i] && prices[i] - minprice>maxprofit)//确保不亏
        {
            maxprofit = prices[i] - minprice;

        }
    }
    return maxprofit;//如果亏了,则返回maxprofit的初始值0

}

283.移动零

在这里插入图片描述

void moveZeroes(int* nums, int numsSize)
{
    int k = 0;
    for (int i = 0;i < numsSize;i++)//先存放非0数字
    {
        if (nums[i] != 0)
        {
            nums[k] = nums[i];
            k++;
        }
    }

    for (int i = k;i < numsSize;i++)//剩下的都是0,k~numsSize 放0
    {
        nums[k] = 0;
        k++;
    }
    return nums;
}

16.最接近的三数之和

在这里插入图片描述

思路:双指针法

int cmp_int(const void* a, const void* b)
{
    return *(int*)a - *(int*)b;
}
int threeSumClosest(int* nums, int numsSize, int target) {
    qsort(nums, numsSize, sizeof(int), cmp_int);//使用快排进行排序
    int best = nums[0] + nums[1] + nums[2];
    for (int i = 0; i < numsSize; i++)
    {
        int left = i + 1;
        int right = numsSize - 1;
        while (left < right)
        {
            int min = nums[i] + nums[left] + nums[left + 1];
            //先来算出最小值,如果target比最小值还小,后面代码就不用进行了,直接break
            if (target < min)
            {
                if (abs(min - target) < abs(best - target))
                {
                    best = min;
                }
                break;
            }
            int max = nums[i] + nums[right] + nums[right - 1];
            //如果target比最大值还大,直接break
            if (target > max)
            {
                if (abs(max - target) < abs(best - target))
                {
                    best = max;
                }
                break;
            }
            int sum = nums[i] + nums[left] + nums[right];
            if (sum == target)//有可能会出现相等的情况,相等了就直接返回
            {
                return target;
            }
            if (abs(sum - target) < abs(best - target))
            {
                best = sum;
            }
            if (sum > target)
            {
                right--;
            }
            else
            {
                left++;
            }
        }
    }
    return best;
}

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

在这里插入图片描述

思路:双指针

int* twoSum(int* nums, int numsSize, int target, int* returnSize)
{
    int* arr=(int*)malloc(sizeof(int)*2);//局部变量函数结束时会销毁,
                                        //所以要用动态数组,动态数组的长度需要用形参返回
    
    *returnSize=2;
    int left=0;
    int right=numsSize-1;
    while(left<right)
    {
        if(nums[left]+nums[right]==target)
        {
            arr[0]=left+1;
            arr[1]=right+1;
            return arr;
        }
        if(nums[left]+nums[right]>target)
        {
            right--;
        }
        else
        {
            left++;
        }
    }
    return arr;
}

15.三数之和

在这里插入图片描述

int** threeSum(int* nums, int numsSize, int* returnSize, int** returnColumnSizes)
{
    * returnSize=0;
    if(numsSize<3)
    { //如果数字不足3个,返回空
        return NULL;
    }
    int flag=1,temp;
    while(flag)
    { //冒泡进行数组排序
        flag=0;
        for(int i=0;i<numsSize-1;i++)
        {
            if(nums[i]>nums[i+1])
            {
                temp=nums[i];
                nums[i]=nums[i+1];
                nums[i+1]=temp;
                flag=1;
            }
        }
    }

    int **res=(int **)malloc(sizeof(int *)*30010);//建立一个保存结果的二维数组
    *returnColumnSizes=(int *)malloc(sizeof(int)*30010);//保存每一行需要存的数字,显然要存3个。

    for(int i=0;i<numsSize-1;i++)
    { 
        //依次移动左边固定的第i个数字
        int left=i+1,right=numsSize-1;//双指针
        if(i>0&&nums[i]==nums[i-1])
        {
            //如果固定的数字重复且判断过,则跳过。注意不可以写成nums[i]==nums[i+1],因为没判断过,  
            //可能会跳过left指定的数字。
            continue;
        }

        while(left<right)
        {
            //双指针循环
            int sum=nums[i]+nums[left]+nums[right];
            if(sum==0)
            {
                res[*returnSize]=(int *)malloc(sizeof(int)*3);
                res[*returnSize][0]=nums[i];
                res[*returnSize][1]=nums[left];
                res[*returnSize][2]=nums[right];
                (*returnColumnSizes)[*returnSize]=3;//要存的3元组
                (*returnSize)++;//行数+1
                left++;
                while(left<right&&nums[left]==nums[left-1])
                {
                    left++;//去重和上面固定数字去重一样
                }
                right--;
                while(left<right&&nums[right]==nums[right+1])
                {
                    right--;
                }
            }
            else if(sum>0)
            {
                right--;
            }
            else if(sum<0)
            {
                left++;
            }

        }

    }
    return res;
}

这次题目有难度!
感谢阅读!!!
👊👊👊

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值