精品刷题训练,刷题训练营
@[目录]
第一,都说刷前面的题是日积月累的事情。刷题要保持良好的习惯,让每道题都能发挥出最好的作用!以下是一位ACM金牌选手建议的刷法。我觉得很好,供你参考。
如何正确做题
从简单开始:从简单暴力开始(时间复杂度高)。优化:在第一步的基础上思考如何优化算法,降低时间复杂度。立意:有了以上两步,这个时候就应该有一个正确的想法了。这时候要构思代码,有哪些部分,每个部分实现什么功能,代码怎么写。而不是直接写代码,没有想清楚就直接写代码,会导致写了一半发现思路不对,写出来的代码都是错的。写代码:实现第三步代码。(Debug):如果我们的主题测试失败,我们应该检查代码是否有bug,并纠正想法。总结与反思:题目已过。要总结知识点,切入角度,同类型题目等。这个话题,并思考是否有更好的方法。做到以上几点,你就能把一个问题学透,遇到同类型的问题也能举一反三。
双指针章节
第二,两个数之和,和hello world一样经典。第一题简介——两个数之和
原标题如下:
给定一个整数数组nums和一个整数目标值target,请找出数组中作为目标值的两个整数,并返回它们的数组下标。
你可以假设每个输入只对应一个答案。但是,数组中的同一个元素不能在答案中重复。
您可以按任意顺序返回答案。
示例1:
输入:nums=[2,7,11,15],目标=9
输出:[0,1]
说明:因为nums[0] nums[1]==9,所以返回[0,1]。
示例2:
输入:nums=[3,2,4],目标=6
输出:[1,2]
示例3:
输入:nums=[3,3],目标=6
输出:[0,1]
提示:
2=nums.length=104
-109=nums[i]=109
-109=目标=109
只有一个有效的答案。
高级:你能想出一个时间复杂度小于O(n2)的算法吗?
思考课程:
2.1.列举暴力。按照解决问题的思路,列举暴力。这里选择快速排序法和快速筛选法。
2.1.1 python实现代码:
类别解决方案:
def twoSum(self,nums: List[int],target: int) - List[int]:
结果=[]
对于范围内的I(len(nums)):
对于范围内的j(I ^ 1,len(nums)):
if target==nums[i] nums[j]:
结果.追加(I)
结果.追加(j)
回送结果
2.1.2 java实现代码:
类别解决方案{
public int[] twoSum(int[] nums,int target) {
List Integer结果=new ArrayList Integer();
for(int I=0;i nums.lengthi ){
for(int j=I 1;j nums.lengthj ){
if(target==nums[i] nums[j])
返回new int[]{i,j };
}
}
返回null
}
}
可以看出java作为编译语言运行速度还是比python快很多,只是消耗内存多一点。
时间复杂度为O(n2)
空间复杂度:O(1)
3.1哈希表(Hash table)我们应用Hashtable对其进行优化。先简单说一下Hashtable的原理。
数组的特点是:容易寻址,不易插入和删除;链表的特点是寻址困难,插入和删除容易。当我们把两者结合起来,就是一个哈希表。
哈希表的底层实际上是基于数组存储的。插入键-值对时,不是直接插入数组,而是通过对键进行哈希运算得到哈希值,然后对数组的容量取模得到在数组中的位置再插入(不要怕多个重复数,用链表压缩同一个值上的多个数)。取值时,先计算指定键的哈希值,再对容量取模,得到底部数组中的对应位置。如果指定的键与存储的键匹配,将返回键-值对;否则,哈希表中没有相应的键值对。这样做的好处是在搜索、插入、删除等操作中可以做到O(1),最坏的情况是O( n)。当然这是最极端的情况,很少遇到。
实现哈希表有许多原则。无论使用哪种语言,实现HashMap的过程都可以分为三个步骤:
实现一个哈希函数,合理解决哈希冲突,实现HashMap的操作方法。这里不深究算法,但大概能看懂。python的dict是哈希表算法,我们可以直接用。
3.1.1 python实现代码:
类别解决方案:
def twoSum(self,nums: List[int],target: int) - List[int]:
结果=[]
Hashmap=dict()
对于I,枚举数(nums):
如果Hashmap中有target - num:
result . append(Hashmap[目标编号])
结果.追加(I)
Hashmap[nums[i]]=i #默认情况下,该值将被忽略。
回送结果
相比之前,执行速度快了十倍,内存消耗多了一点。
时间复杂度:O(n)
空间复杂度:O(1)
这里稍微讲一下秒,因为有一种特殊情况。
输入:
[3,2,4]
六
这时候如果正常遍历所有数字,将有可能加到3,因为6-3=3在nums,也就是自己和自己加在一起。解决方法:错开索引,在字典中当前索引处创建对应的值,跳过这个循环判断下一个值。
3.1.2 Java实现类解决方案{
public int[] twoSum(int[] nums,int target) {
Map Integer,Integer HashMap=new HashMap Integer,Integer();
List Integer结果=new ArrayList Integer();
for(int I=0;i nums.lengthi ){
if(hashmap . contains key(target-nums[I])){
return new int[]{ hashmap . get(target-nums[I]),I };
}
hashmap.put(nums[i],I);
}
返回新的int[0];
}
}
比之前的蛮力枚举快十倍,内存消耗没有变化。
在这里,我们已经成功的迈出了刷题的第一步。
今日推荐——牛科。com就是学习和掌握一门语言的快速方法就是通过刷题和练习来运用这门语言的语法,通过和其他语言的对比来获得更深的理解和收获!
如果你还不知道哪里可以用小白刷题来掌握语法,牛科。com的亲测很不错!点击链接跳转到牛科。com登录并注册。他们的IT题库内容丰富,在国内做得比较好。而且是一站式求职学习网站,里面所有最重要的资源都是免费的!
他们的Java Python问题单从最基本的输出,字符串打印格式入手,通过运算符、列表、循环语句、条件语句、元组、字典、函数等知识点,一步步教你学习Java Python为数不多的基本语法。最后,它可以用八道综合实际问题来帮助你更有效地巩固之前所学的知识。
Niu.com还提供了一个问题解决区和一个讨论区。会有大神提供解题思路。对新手玩家比较友好,语法不清楚,有看不懂的地方。看看别人的想法,别人的代码,也许会豁然开朗。
如果你现在就忍不住卷起来,点击下面的链接来学习吧!
链接:点击链接跳转到牛科。com开始刷题!
如果您没有帐户,请单击链接登录并注册!
电脑魔术师原创作品,
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。