LeetCode练习题1、15

1、两数之和

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个 整数,并返回他们的数组下标

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。

示例:

给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9

所以返回 [0, 1]

来源:力扣(LeetCode)
链接:两数之和
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

int* twoSum(int* nums, int numsSize, int target, int* returnSize){
    int i, j;
    int *a = (int *)malloc(sizeof(int) * 2);
    for (i = 0; i < numsSize - 1; i++) {
        for (j = i+1; j < numsSize; j++) {
            if (nums[i] + nums[j] == target) {
                * returnSize = 2;
                a[0] = i;
                a[1] = j;
            }
        }
    }
    return a;
}

2、三数之和

给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。

示例:
给定数组 nums = [-1, 0, 1, 2, -1, -4],

满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]

来源:力扣(LeetCode)
链接:三数之和
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

方法:双指针法
首先用快排给数组中的元素排序
最左边的数值即为最小值,最小值必须小于等于0
左右指针向里移动,重复时跳过
最小值及左右指针对应值和为0时,返回数组,左右指针移动
最小值及左右指针对应值和小于0时,返回数组,左指针移动
最小值及左右指针对应值和大于0时,返回数组,右指针移动

可以写快排算法,也可以直接调用stdlib.h库中快排函数
/**
 * Return an array of arrays of size *returnSize.
 * The sizes of the arrays are returned as *returnColumnSizes array.
 * Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
 */
void Quicksort(int *nums, int low, int high) {
    if(low < high) {
        int i = low;
        int j = high;
        int temp = nums[low];
        while(i < j) {
            while(i < j && nums[j] >= temp) {
               j--;
            }
            if(i < j) {
               nums[i] = nums[j];
            }
            while(i < j && nums[i] <= temp) {
               i++;
            }
            if(i < j) {
               nums[j] = nums[i];
            }
        }
        nums[i] = temp;
        Quicksort(nums, low, i-1);
        Quicksort(nums, i+1, high);
    }
}
int** threeSum(int* nums, int numsSize, int* returnSize, int**returnColumnSizes){
    Quicksort(nums, 0, numsSize-1);
    int t = 0;
    int sum = 0;
    int i, j;
    int **array = (int **)malloc(sizeof(int *)*numsSize*numsSize);
    *returnColumnSizes = (int *)malloc(sizeof(int)*numsSize*numsSize);
    (*returnSize) = 0;
    for(t = 0; t <= numsSize - 3; t++) {
        if(nums[t] > 0) {
            break;
        }
        if(t > 0 && nums[t] == nums[t-1]) {
            continue;
        }
        i = t+1;
        j = numsSize-1;
        while(i < j) {
            sum = nums[t] + nums[i] + nums[j];
            if(sum < 0) {
                i++;
            }
            else if(sum > 0) {
                j--;
            }
            else {
                array[*returnSize] = (int *)malloc(sizeof(int )*3);
                (*returnColumnSizes)[*returnSize] = 3;
                array[*returnSize][0] = nums[t];
                array[*returnSize][1] = nums[i];
                array[*returnSize][2] = nums[j];
                (*returnSize)++;
                while(i < j && nums[i] == nums[i+1]) {
                    i++;
                }
                while(i < j && nums[j] == nums[j-1]) {
                    j--;
                }
                i++;
                j--;
            }
        }
    }
    return array;
}

在C语言的库函数中就有快速排序的库函数,即为qsort, 其用法如下:
功 能: 快速排序
头文件:stdlib.h
用 法:

void qsort(void *base,int nelem,int width,int (*fcmp)(const void *,const void *));

参数:
1 待排序数组首元素的地址
2 数组中待排序元素数量
3 各元素的占用空间大小
4 指向函数的指针,用于确定排序的顺序

int CompareByIncrease(const void* a, const void* b)
{
    return *(int*)a - *(int*)b; // 快排构造递增序列
}

首先构造递增序列,然后在主函数中调用

qsort(nums, numsSize, sizeof(int), CompareByIncrease);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LeetCode是一个著名的在线编程题库,可以帮助计算机程序员提升编程能力。LeetCode的题目涵盖了算法、数据结构、字符串、数组、链表等多个方面的知识,对于求职面试以及算法竞赛准备非常有帮助。 LeetCode上的编程题目分为简单、中等和困难三个难度级别。每个题目都有详细的题目描述、输入输出示例以及参考答案等内容。在解决每个问题时,我们需要仔细阅读题目,并根据题目要求提供正确的解答。 通常,我们需要使用编程语言如Python、C++等来实现解题思路。在编码之前,我们需要先分析问题,并找到合适的算法或数据结构来解决问题。一般来说,我们可以使用递归、迭代、动态规划等方法来解决常见的编程问题。 在LeetCode上,我们可以提交解答,并测试解答是否通过了所有的测试用例。如果通过了所有的测试用例,我们就可以得到题目的AC(Accepted)结果,并获得该题目的通过证书。如果没有通过所有的测试用例,我们可以检查自己的解答,查找解答中的错误或者不完善之处,并进行修改和优化。 总之,LeetCode编程题是一个优秀的学习和练习编程的平台。通过解答LeetCode上的编程题目,我们可以提升自己的编程能力,并且培养解决问题的思维方式。无论是求职面试还是算法竞赛,LeetCode编程题都是非常有帮助的资源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值