第一次接触算法?关于LeetCode算法实战,你想要了解的都在这里

写在前面

笔者接触算法时间也不是很久,学习算法主要为了工作,在搜寻许久之后未找到新手入门详细教程,故萌生了写博客记录学习过程的想法,与各位一起进步,在此引用一位我很喜欢的博主“英雄哪里出来”的一句话:“一个人可以走的很快,一群人才能走的更远”

此文意在为初学算法的读者提供一个方便新手入门算法世界的“先导”,算法于大部分人来说是枯燥无味的,但是在我们的编程中也是必不可少的,我们需要熟练的掌握和使用。在初期学习算法时,不断的练习是必要的,但是练习的过程是痛苦的,要学习算法,就需要熬过这个阵痛期,在我看来最好的办法是把算法练习变成自己的一个习惯( 本来想说爱好,想着不能自欺欺人,我爱不了一点),不积跬步无以至千里,不积小流无以成江海,希望各位能够有所收获。

一、关于LeetCode

LeetCode是一个在线编程平台,可以通过浏览器搜索“力扣”或者“LeetCode”点击进入

链接:leetcode_百度搜索 (baidu.com)

 作为一个成熟的算法练习平台,它提供了大量的算法题目,能够使开发者在不断练习的过程中提高自身的算法和数据结构能力。

注册一个账号登录进入LeetCode ,点击题库,选择自己需要练习的题目,点击题目,即可开始练习。

二、LeetCode的算法练习特点

1、题库的广泛性:

LeetCode 题库中有大量的题目,覆盖了各种难度级别算法主题,包括数组、字符串、链表、树、图、动态规划、贪心算法、回溯算法、排序算法等。这些题目往往与实际编程工作密切相关,有助于提升算法解决问题的能力。

2、题目难度和标记:

LeetCode 将每个题目标记为简单(Easy)、中等(Medium)或困难(Hard),以便用户根据自己的能力选择适合的题目进行练习。这种分类有助于逐步提高算法思维和解决复杂问题的能力。

3、提供多种编程语言支持:

LeetCode 支持多种主流编程语言,包括 C、C++、Java、Python、JavaScript 等。可以在熟悉的编程语言中实现算法解决方案,并进行测试和提交。

4、运行测试:

LeetCode提供运行测试功能,可以检查代码是否出错。

  

5、提供评测和讨论:

LeetCode 提供了一个自动评测系统,可以对提交的代码进行评测并给出运行时间内存消耗等统计信息,方便开发者了解自己算法的优劣。此外,每个题目都有一个讨论区,可以在其中与其他用户交流解题思路、优化方法和解决问题时遇到的困难。

注意,开发者在评论时应当遵守评论区规则 

 附:讨论区规则

(1. 请不要在评论区发表题解!

   2. 评论区可以发表关于对翻译的建议、对题目的疑问及其延伸讨论。

   3. 如果你需要整理题解思路,获得反馈从而进阶提升,可以去题解区进行。)

5、面试准备:

LeetCode 也被广泛用于准备技术面试。它提供了一些常见的面试题目和面试环境,可以帮助熟悉常见的算法问题和面试流程,很多大厂的算法题都可以提前练习,熟能生巧。

三、在LeetCode编写算法注意事项

1、关于main函数

在LeetCode平台上,每个题目都是独立的。

在使用LeetCode练习算法时,代码只需要包含实现题目所需的函数,而不需要包含主函数main。因为在LeetCode平台上,会自动调用预定义的main函数来测试提交的代码。

2、算法两数之和代码实现

定义twoSum函数:


// 此函数接受一个整数数组、数组大小、目标和和一个用于存储结果数组大小的指针
int* twoSum(int* nums, int numsSize, int target, int* returnSize) {
    // 创建一个返回结果的数组
    int* result = (int*)malloc(2 * sizeof(int));
    // 设置返回结果数组大小为2
    *returnSize = 2;
    
    // 遍历数组中的每个元素
    for (int i = 0; i < numsSize; i++) {
        // 在当前元素后面的子数组中查找与目标值匹配的元素
        for (int j = i + 1; j < numsSize; j++) {
            // 如果找到目标值匹配的元素,将它们的下标存储在结果数组中并返回
            if (nums[i] + nums[j] == target) {
                result[0] = i;
                result[1] = j;
                return result;
            }
        }
    }
    
    // 如果遍历完数组后仍然没有找到匹配的元素,则释放结果数组的内存并返回NULL
    free(result);
    *returnSize = 0;
    return NULL;
}

3、关于代码传参问题

在LeetCode平台上,参数的传入方式是通过函数的参数进行传递的。对于本算法「两数之和」问题,在LeetCode上的函数签名已经预定义好了,只需要按照函数签名的要求实现函数即可。

在LeetCode平台上,无需自己定义main函数或处理输入输出。LeetCode会自动调用预定义的main函数,将测试用例传入给开发者运行实现的twoSum函数,并检查返回的结果是否正确。

只需要专注于实现twoSum函数,根据函数签名的要求,在给定的整数数组nums中寻找两个数的下标,使得它们的和等于给定的目标值target。并且,根据函数签名的要求,需要使用动态内存分配来分配存储结果的数组,并将数组的大小存储在指针returnSize中。请在函数实现中注意释放分配的内存,以避免内存泄漏。

LeetCode平台会根据实现的函数进行测试并返回对应的结果。

 四、在此附录包含main函数的版本

包含main函数,可以方便读者在将函数应用于实际编程的过程提供借鉴。

#include <stdio.h>
#include <stdio.h>

// 此函数接受一个整数数组、数组大小、目标和和一个用于存储结果数组大小的指针
int* twoSum(int* nums, int numsSize, int target, int* returnSize) {
    // 创建一个返回结果的数组
    int* result = (int*)malloc(2 * sizeof(int));
    // 设置返回结果数组大小为2
    *returnSize = 2;
    
    // 遍历数组中的每个元素
    for (int i = 0; i < numsSize; i++) {
        // 在当前元素后面的子数组中查找与目标值匹配的元素
        for (int j = i + 1; j < numsSize; j++) {
            // 如果找到目标值匹配的元素,将它们的下标存储在结果数组中并返回
            if (nums[i] + nums[j] == target) {
                result[0] = i;
                result[1] = j;
                return result;
            }
        }
    }
    
    // 如果遍历完数组后仍然没有找到匹配的元素,则释放结果数组的内存并返回NULL
    free(result);
    *returnSize = 0;
    return NULL;
}

int main() {
    // 定义输入数组和目标和
    int nums[] = {2, 7, 11, 15};
    int target = 9;
    int returnSize;
    
    // 调用 twoSum 函数,传入输入数组、数组大小、目标和和结果数组大小的指针
    int* result = twoSum(nums, sizeof(nums) / sizeof(nums[0]), target, &returnSize);
  
    // 检查结果是否为空
    if (result != NULL) {
        printf("找到和为目标值的两个元素的数组下标为: %d, %d\n", result[0], result[1]);
        // 需要手动释放结果数组的内存
        free(result);
    } else {
        printf("未找到匹配的元素\n");
    }
    
    return 0;
}

 以上内容就是我对初次使用LeetCode的一些见解,欢迎各位在评论区留言讨论,期待我们的一起进步。

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值