公告:作者已将LeetCode题目的答案整理至GitHub上,希望大家多多star,目前只有一部分,会每天持续更新的~~
地址:https://github.com/ZLeopard/LeetCode
22. 括号生成
给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。
例如,给出 n = 3,生成结果为:
[ “((()))”, “(()())”, “(())()”, “()(())”, “()()()” ]
思路:使用递归的思想,首先确立递归结束的条件,然后生成的左括号数如果大于右边了,就在字符串加入有括号,算法非常巧妙,我也是用IDE一句一句调试才理解的,一般人真得不好想出来。。。
class Solution {
public:
void generator(vector<string> &ans, string s, int l, int r, int n) {
if(l==n) {
ans.push_back(s.append(n-r, ')'));
return;
}
generator(ans, s+"(", l+1, r, n);
if(l>r) generator(ans, s+")", l, r+1, n);
}
vector<string> generateParenthesis(int n) {
vector<string> ans;
generator(ans, "", 0, 0, n);
return ans;
}
};
23. 两两交换链表中的节点
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
示例:
给定 1->2->3->4, 你应该返回 2->1->4->3.
说明:
你的算法只能使用常数的额外空间。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
ListNode* dummy = new ListNode(0);
dummy->next = head;
ListNode* cur = dummy;
while(cur->next && cur->next->next){
ListNode* nextone = cur->next;
ListNode* nexttwo = nextone->next;
ListNode* nextthree = nexttwo->next;
cur->next = nexttwo;
nextone->next = nextthree;
nexttwo->next = nextone;
cur = nextone;
}
return dummy->next;
}
};
24. 删除排序数组中的重复项
给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
示例 1:
给定数组 nums = [1,1,2],
函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。
你不需要考虑数组中超出新长度后面的元素。
C++代码:
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int n = 1;
if(nums.size() == 0)
return NULL;
for(int i = 1;i < nums.size();i++){
if(nums[i-1] != nums[i]){
nums[n++] = nums[i];
}
}
return n;
}
};
25. 移除元素
给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
示例 1:
给定 nums = [3,2,2,3], val = 3,
函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。
你不需要考虑数组中超出新长度后面的元素。
C++代码:
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int i = 0, n = nums.size();
while(i < n){
if(nums[i] == val){
nums[i] = nums[n-1]; //确定长度后面的值不予考虑
n--;
}
else
i++; // 如果上面条件满足,则不会进行i++,所以下次仍然可以检查该元素
}
return n;
}
};
声明
以上代码均参考于牛客网并在牛客网测试成功。参考了各位大佬的思路整理而成,希望大家一起学习~