【Leetcode-20.有效的括号 -26.删除有序数组中的重复项】

简介: 【Leetcode-20.有效的括号 -26.删除有序数组中的重复项】

Leetcode-20.有效的括号

题目:给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

左括号必须用相同类型的右括号闭合。

左括号必须以正确的顺序闭合。

每个右括号都有一个对应的相同类型的左括号。

我们的思路是,考虑到它的括号匹配,先进的后出,后进的先出,这就符合栈的进出,所以我们用栈的思想做;

下面看代码和注释:

char func(char ch)
    {
        if (ch == ')')
            return '(';
        else if (ch == ']')
            return '[';
        else if (ch == '}')
            return '{';
        else
            return 0;
    }
    bool isValid(char* s) 
    {
        int len = strlen(s);
        //如果长度为奇数,直接返回false
        if (len % 2 == 1)
        {
            return false;
        }
        //top记录栈顶的位置
        int top = 0;
        //创建一个栈
        char stack[len + 1];
        //从头开始循环
        for (int i = 0; i < len; i++)
        {
            //将每个字符都传进func函数判断,若是左括号则进栈,返回0,栈顶往上走
            //若是右括号,返回它对应的左括号,即弹出对应的左括号(出栈),因为先进的后出,后进的先出,栈顶往下
            if (func(s[i]))
            {
                //这里要判断一开始就是不是右括号,若是,即top为0,直接返回false
                //还要判断当前栈顶的下一个元素是否与当前的右括号匹配,若不相等也返回false
                if (top == 0 || stack[top - 1] != func(s[i]))
                {
                    return false;
                }
                top--;
            }
            else
            {
                stack[top] = s[i];
                top++;
            }
        }
        //判断当前栈是否为空,若栈里只有左括号没有右括号,左括号就没得抵消,当前的栈应该不为空,top==0为假,即为false
        //若栈中的左括号全被抵消,top==0为真,返回true;
        return top == 0;
    }

Leetcode-26.删除有序数组中的重复项

题目:给你一个升序排列 的数组 nums ,请你原地 删除重复出现的元素,使每个元素只出现一次 ,返回删除后数组的新长度。元素的相对顺序应该保持一致 。

我们的思路是双指针,一个是fast,一个是slow,一开始两个都赋给1(fast和slow都是作为元素的下标),当fast和fast-1对应的元素相等,fast就往后走 ,直到它们不相等, 这就说明slow到fast-1对应的元素都是相等的,所以把fast对应的元素赋给slow对应的元素,slow再往后走;循环往复,直到fast大于数组长度,循环结束;

下面看代码和注释:

int removeDuplicates(int* nums, int numsSize)
    {
        //如果数组长度为0,返回0
        if (numsSize == 0)
            return 0;
        //“双指针”问题,下标都从1开始
        int fast = 1;
        int slow = 1;
        //当快的“指针”的下标小于数组长度继续
        while (fast < numsSize)
        {
            //当fast下标对应的元素与它后一个元素不相等时,证明slow到fast-1的元素都是相等的;
            //所以将slow下标对应的元素改成fast下标对应的元素,slow再跳到下一个去
            if (nums[fast] != nums[fast - 1])
            {
                nums[slow] = nums[fast];
                slow++;
            }
            //如果fast与fast-1对应的元素相等,fast往后走
            fast++;
        }
        //返回slow的长度
        return slow;
    }
目录
相关文章
|
13天前
leetCode(删除有序数组中的重复项)
如何在不使用额外空间的情况下,通过双指针法原地删除有序数组中的重复项。
27 2
|
2月前
|
存储 Java API
LeetCode------合并两个有序数组(4)【数组】
这篇文章介绍了LeetCode上的"合并两个有序数组"问题,并提供了三种解法:第一种是使用Java的Arrays.sort()方法直接对合并后的数组进行排序;第二种是使用辅助数组和双指针技术进行合并;第三种则是从后向前的双指针方法,避免了使用额外的辅助数组。
LeetCode------合并两个有序数组(4)【数组】
|
13天前
【LeetCode-每日一题】 删除排序数组中的重复项
【LeetCode-每日一题】 删除排序数组中的重复项
16 4
|
13天前
|
算法 C++
Leetcode第二十二题(括号生成)
这篇文章讨论了如何使用递归算法解决LeetCode第22题“括号生成”的问题,提供了两种C++的实现方法,目的是生成所有有效的括号组合。
9 0
Leetcode第二十二题(括号生成)
|
12天前
【LeetCode 48】108.将有序数组转换为二叉搜索树
【LeetCode 48】108.将有序数组转换为二叉搜索树
27 0
|
13天前
|
存储 C++ 容器
Leetcode第二十题(有效的括号)
这篇文章介绍了如何使用栈来解决LeetCode第20题“有效的括号”问题,提供了两种方法:数组栈和容器栈,以及相应的C++代码实现。
12 0
|
2月前
|
算法
LeetCode第26题删除有序数组中的重复项
这篇文章介绍了LeetCode第26题"删除有序数组中的重复项"的解题方法,通过使用双指针技巧,高效地去除数组中的相邻重复元素。
LeetCode第26题删除有序数组中的重复项
|
2月前
|
算法
LeetCode第22题括号生成
该文章介绍了 LeetCode 第 22 题括号生成的解法,通过回溯算法生成所有可能的括号组合,在递归过程中根据左右括号数量的条件进行剪枝,从而得到有效的括号组合。
LeetCode第22题括号生成
|
2月前
|
算法
LeetCode第80题删除有序数组中的重复项 II
文章介绍了LeetCode第80题"删除有序数组中的重复项 II"的解法,利用双指针技术在O(1)空间复杂度内原地删除重复元素,并总结了双指针技术在处理有序数组问题中的应用。
LeetCode第80题删除有序数组中的重复项 II
|
2月前
|
算法
LeetCode第88题合并两个有序数组
文章分享了LeetCode第88题"合并两个有序数组"的解法,通过从后向前的合并策略避免了数组元素的前移,使用三个指针高效地完成了合并过程。