LeetCode刷题之路(第六天)

公告:作者已将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;
    }
};

声明

以上代码均参考于牛客网并在牛客网测试成功。参考了各位大佬的思路整理而成,希望大家一起学习~

猜你喜欢

转载自blog.csdn.net/weixin_41576121/article/details/82817853