两数之和:
题目描述:给一个target要求在一个数组里找到和为target的两个数。
这道题最省事的方法是用哈希表,时间复杂度较低
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) { //vector容器相当于一个动态数组
unordered_map<int,int>haxibiao; //定义一个哈希表
for(int i=0;i<nums.size();i++){
auto it=haxibiao.find(target-nums[i]); //auto it自动迭代器,通过find方法 遍历数组
if(it!=haxibiao.end()){
return{it->second,i}; //若能找到,返回两个数字的下表(值)
}
haxibiao[nums[i]]=i; //数组元素作为键,下表作为值
}
return{}; //若找不到,返回空
}
};
总结一下这道题,首先用哈希表是毫无疑问的,太方便而且时间复杂度低,刚开始我是想着先用一个for吧哈希表填满,后来看了解析发现查找和存入工作可以一起,相当于遍历了每个数字和它前面所有数的可能性,这个搞清楚之后剩下的就是一些方法了:
auto it是一个自动迭代器,用于遍历容器内的对象,it类似于指针,可用*获取值
find函数需要输入键,返回的是迭代器
it->first是键,it->second是值,这道题将元素作为键,下表作为值
移动零:
题目描述:给一个数组 nums
,编写一个函数将所有 0
移动到数组的末尾,同时保持非零元素的相对顺序。必须在不复制数组的情况下原地对数组进行操作
拿题思路:不能复制数组,就只能改变原数组的值达到目的,很明显,遍历一遍数组碰到不是0的数字就往前堆就行
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int n=nums.size(),m=0;
for(int i=0;i<n;i++){
if(nums[i]){
nums[m]=nums[i];
m++;
}
}
for(int i=n+1-m;i<n;i++){
nums[i]=0;
}
}
};
这道题不难,也没啥可标注的
反转链表:
题目描述:给你单链表的头节点 head
,请你反转链表,并返回反转后的链表
拿题思路:首先得非常了解链表这个数据结构,它在内存中不是连续的一块空间,连接起来每个节点的是其指针域,指针指向下一个节点的地址,最后一个节点的指针域指向空。那我们只需要吧它每个节点的指针域的指向方向反转一下就可以了。
class Solution {
public:
ListNode* reverseList(ListNode* head) { //指针类型的函数,返回也需要一个指针
ListNode* curr=head;
ListNode*prev=nullptr;
while(curr){
ListNode* next=curr->next;
curr->next=prev;
prev=curr;
curr=next;
}
return prev;
}
};
这道题需要深刻理解链表这种数据结构,理解之后问题不大
(大概就是这样,新手没经验做了三道简单题,有什么错误或者更好的方法希望大佬指正,吐槽一下,leetcode这个答题模式真的不方便,汗流浃背了)