写在前面
笔者接触算法时间也不是很久,学习算法主要为了工作,在搜寻许久之后未找到新手入门详细教程,故萌生了写博客记录学习过程的想法,与各位一起进步,在此引用一位我很喜欢的博主“英雄哪里出来”的一句话:“一个人可以走的很快,一群人才能走的更远”。
此文意在为初学算法的读者提供一个方便新手入门算法世界的“先导”,算法于大部分人来说是枯燥无味的,但是在我们的编程中也是必不可少的,我们需要熟练的掌握和使用。在初期学习算法时,不断的练习是必要的,但是练习的过程是痛苦的,要学习算法,就需要熬过这个阵痛期,在我看来最好的办法是把算法练习变成自己的一个习惯( 本来想说爱好,想着不能自欺欺人,我爱不了一点),不积跬步无以至千里,不积小流无以成江海,希望各位能够有所收获。
一、关于LeetCode
LeetCode是一个在线编程平台,可以通过浏览器搜索“力扣”或者“LeetCode”点击进入
作为一个成熟的算法练习平台,它提供了大量的算法题目,能够使开发者在不断练习的过程中提高自身的算法和数据结构能力。
注册一个账号登录进入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的一些见解,欢迎各位在评论区留言讨论,期待我们的一起进步。