首页 > 其他分享 >力扣刷题(6)

力扣刷题(6)

时间:2024-09-16 10:23:22浏览次数:11  
标签:numsSize return target nums int ret 力扣 刷题

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

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

在这里插入图片描述
思路:

  1. 因为该数组是非递减顺序排列,因此可以设两个左右下标
  2. 当左右下标的数相加大于target时,则表示右下标的数字过大,因此将右下标 - -
  3. 当左右下标的数相加小于target时,则表示左下标的数字过小,因此将左下标 + +
  4. 当相等时,则将左右下标赋值给动态开辟的数组,并返回(注意左右下标要+1)
int* twoSum(int* numbers, int numbersSize, int target, int* returnSize) {
    int* ret=(int*)malloc(sizeof(int)*2);
    *returnSize=2;
    int left =0,right=numbersSize-1;
    while(left < right)
    {
        if(numbers[left] + numbers[right] == target)
        {
            ret[0]=left+1;
            ret[1]=right+1;
            return ret;
        }
        else if(numbers[left] + numbers[right] > target)
        {
            right--;
        }
        else
        {
            left++;
        }
    }
    return ret;
}

在这里插入图片描述

三数之和

三数之和-力扣
在这里插入图片描述
思路来源:灵茶山艾府

  1. 将数组进行排序
  2. 将三个数分为两组,第一个数一组,第二三个数的和分为一组,这样思路就和上一题的两数相加相同了
  3. 当第一个数存在重复时,需要continue从而跳到最后一个重复的数
  4. 再对后两个数进行判断,思路同第一题

这题存在两个能够进行优化的地方:

  1. 当三个连续数字相加大于0时,则不存在和为0的数字,可以直接break退出循环(因为数组是有序的)
  2. 当一个数和最后两个最大的数字之和小于0,则该数字不可能存在为0的情况,直接continue进入下一个数字的判断即可
int cmp(const void* a, const void* b)
 {
    return *(int*)a-*(int*)b;
 }

int** threeSum(int* nums, int numsSize, int* returnSize, int** returnColumnSizes) {
    qsort(nums,numsSize,sizeof(int),cmp);
    int** ret=(int**)malloc(sizeof(int*)*numsSize*numsSize);
    *returnColumnSizes=(int*)malloc(sizeof(int)*numsSize*numsSize);
    int m=0;
    for(int i=0;i<numsSize-2;i++)
    {
    	//跳过重复数字
        if(i > 0 && nums[i] == nums[i-1])
            continue;
        if(nums[i] + nums[i+1] + nums[i+2] > 0)
            break;//优化一
        if(nums[i] + nums[numsSize-1] + nums[numsSize-2] < 0)
            continue;//优化二
        int j=i+1;
        int k=numsSize-1;
        while(j < k)
        {
            if(nums[i] + nums[j] + nums[k] > 0)
                k--;
            else if(nums[i] + nums[j] + nums[k] < 0)
                j++;
            else
            {
            	//添加三元组
                int* arr=(int*)malloc(sizeof(int)*3);
                arr[0]=nums[i];
                arr[1]=nums[j];
                arr[2]=nums[k];
                ret[m]=arr;
                (*returnColumnSizes)[m++]=3;
                //跳过重复数字
                for(j++;j < k && nums[j] == nums[j-1];j++);
                for(k--;k > j && nums[k] == nums[k+1];k--);
            }
        }
    }
    *returnSize=m;
    return ret;
}

在这里插入图片描述

最接近的三数之和

最接近的三数之和-力扣
在这里插入图片描述
思路同第二题类似

int cmp(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 sum=nums[0]+nums[1]+nums[2];
    for(int i=0;i<numsSize-2;i++)
    {
        int j=i+1;
        int k=numsSize-1;
        while(j < k)
        {
            int tmp=nums[i]+nums[j]+nums[k];
            if(abs(tmp-target) < abs(sum-target))
                sum=tmp;
            if(tmp > target)
                k--;
            else if(tmp < target)
                j++;
            else
                return sum;
        }
    }
    return sum;
}

在这里插入图片描述

标签:numsSize,return,target,nums,int,ret,力扣,刷题
From: https://blog.csdn.net/2302_79180171/article/details/142287922

相关文章

  • 力扣136.只出现一次的数字
    题目描述:给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。解题思路:看到数组刚开始想的是排序后遍历,但是时间复杂度太高了......
  • 力扣热题100 - 二叉树:验证二叉搜索树
    题目描述:题号:98给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。有效 二叉搜索树定义如下:节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。解题思路:思路一......
  • 打卡信奥刷题(761)用Scratch图形化工具信奥P5713[普及组/提高组] 【深基3.例5】洛谷团队
    【深基3.例5】洛谷团队系统题目描述在洛谷上使用团队系统非常方便的添加自己的题目。如果在自己的电脑上配置题目和测试数据,每题需要花费时间555分钟;而在洛谷团队中上......
  • 力扣最热一百题——螺旋矩阵
    目录题目链接:54.螺旋矩阵-力扣(LeetCode)题目描述示例提示:解法一:模拟1.边界初始化2.循环遍历矩阵3.从左到右遍历上边界4.从上到下遍历右边界5.从右到左遍历下边界6.从下到上遍历左边界7.结束条件代码执行流程总结Java写法:运行时间以及内存消耗C++写法......
  • SSM华天计算机面试刷题系统-计算机毕业设计源码22543
    摘 要华天计算机面试刷题系统是一款基于SSM(Spring、SpringMVC、MyBatis)框架、利用Java编程语言和MySQL数据库,开发的在线学习和测试平台。系统利用SSM框架及前端开发技术,实现了模块化开发和管理,前后端交互以及数据库操作等功能。系统具备良好的扩展性、稳定性和可维护性。......
  • 力扣494-目标和(Java详细题解)
    题目链接:494.目标和-力扣(LeetCode)前情提要:因为本人最近都来刷dp类的题目所以该题就默认用dp方法来做。最近刚学完01背包,所以现在的题解都是以01背包问题为基础再来写的。如果大家不懂01背包的话,建议可以去学一学,01背包问题可以说是背包问题的基础。如果大家感兴趣,......
  • leetcode刷题day17|二叉树Part05(654.最大二叉树、617.合并二叉树、700.二叉搜索树中的
    654.最大二叉树构造树一般采用的是前序遍历,因为先构造中间节点,然后递归构造左子树和右子树。递归三步曲:1、传入参数,整数数组,数组的开始和结束,返回树的中间节点。2、终止条件:开始大于等于结束,即数组为空。3、递归逻辑:找到最大的元素,记录元素其下标,构建中间节点;递归构造......
  • CTF攻防世界小白刷题自学笔记6
    1.view_source,难度:1,方向:Web,题目来源:Cyberpeace-n3k0题目描述:X老师让小宁同学查看一个网页的源代码,但小宁同学发现鼠标右键好像不管用了。打开一看显示FLAGisnothere,右击鼠标果然没反应,估计是不想我们查看网页源代码。下意识按了一下F12(开发者工具),笑死直接出来了,最简......
  • 力扣刷题——2398. 预算内的最多机器人数目
    由题目中求“最多可以连续运行的机器人数目”可知,求的是数组子数组的长度,那么就可以直接使用滑动窗口求解。配合前缀和,可以快速的求得滑动窗口内的运行时间和。那么编写代码如下:intmaximumRobots(vector<int>&chargeTimes,vector<int>&runningCosts,longlongbudget){......
  • 代码随想录突击版刷题
    704.二分查找https://leetcode.cn/problems/binary-search/description/ 59.螺旋矩阵II https://leetcode.cn/problems/spiral-matrix-ii/description/、参考题解写出54.螺旋矩阵 https://leetcode.cn/problems/spiral-matrix/description/classSolution{public:......