leetcode刷题收获
引言
到目前为止,在leetcode上刷了近二十题,如果就这么刷下去,以下好处自然会有:coding熟练度的提升、STL的使用、思考和解决问题的熟练度。
然而,数据结构和算法的进一步学习、未接触过的新的c++语言特性的学习、改掉编程中的陋习等等很难在刷题中达成,因此,需要有目标的刷题。
刷题过程
- 追求效率,如果时间复杂度足够优化,排名前10%应该是没问题的
- 时间复杂度优化不出来的题,评论区看大佬的解答,然后想明白,最好自己再实现一遍
- 尝试使用未实践过的数据结构、算法、C++语言特性。
- 发现自己coding中的陋习,或是可改进的地方,对自己coding 能力的提升大有裨益
技巧收获汇总
1. 边界情况要主动处理好,比在调试的时候去纠正省时的多
for example: 19. Remove Nth Node From End of List
Given a linked list, remove the n-th node from the end of list and return its head.
//Solution in one pass
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
//if(head->next==NULL) return NULL;
vector<ListNode*> vl;
ListNode *p=head;
while(p!=NULL)
{
vl.push_back(p);
p=p->next;
}
int i=vl.size()-n;
if(i==0) return head->next;
else if(i==vl.size()-1) vl[i-1]->next=NULL;
else vl[i-1]->next=vl[i+1];
return head;
}
};
题中要求删除的位置的边界情况是,首元素 head 和 末尾元素,head 的特征是没有前驱元素, 末尾元素的特征是没有后继元素;这两种情况的处理和中间元素是不一样的。
2. 使用STL提供的容器有时会影响效率
for example: 20. Valid Parentheses
我首先用map做了一遍,耗时12ms
class Solution {
public:
bool isValid(string s) {
stack<char> st;
map<char,char> zuo;
zuo[')']='(';
zuo[']']='[';
zuo['}']='{';
int i;
for(i=0;i<s.length();i++)
{
if(s[i]=='(' || s[i]=='{' || s[i]=='[') st.push(s[i]);
else if(!st.empty() && st.top()==zuo[s[i]]) st.pop();
else break;
}
if(st.empty() && i==s.length()) return true;
else return false;
}
};
然后用数组做了一遍,耗时4ms
class Solution {
public:
bool isValid(string s) {
stack<char> st;
char zuo[300];
zuo[')']='(';
zuo[']']='[';
zuo['}']='{';
int i;
for(i=0;i<s.length();i++)
{
if(s[i]=='(' || s[i]=='{' || s[i]=='[') st.push(s[i]);
else if(!st.empty() && st.top()==zuo[s[i]]) st.pop();
else break;
}
if(st.empty() && i==s.length()) return true;
else return false;
}
};