【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;
    }
目录
相关文章
leetCode(删除有序数组中的重复项)
如何在不使用额外空间的情况下,通过双指针法原地删除有序数组中的重复项。
221 2
|
Go 索引 Perl
【LeetCode 热题100】【二叉树构造题精讲:前序 + 中序建树 & 有序数组构造 BST】(详细解析)(Go语言版)
本文详细解析了二叉树构造的两类经典问题:通过前序与中序遍历重建二叉树(LeetCode 105),以及将有序数组转化为平衡二叉搜索树(BST,LeetCode 108)。文章从核心思路、递归解法到实现细节逐一拆解,强调通过索引控制子树范围以优化性能,并对比两题的不同构造逻辑。最后总结通用构造套路,提供进阶思考方向,帮助彻底掌握二叉树构造类题目。
1094 9
|
算法 Go 索引
【LeetCode 热题100】回溯:括号生成 & 组合总和(力扣22 / 39 )(Go语言版)
本文深入解析了LeetCode上的两道经典回溯算法题:**22. 括号生成**与**39. 组合总和**。括号生成通过维护左右括号数量,确保路径合法并构造有效组合;组合总和则允许元素重复选择,利用剪枝优化搜索空间以找到所有满足目标和的组合。两者均需明确路径、选择列表及结束条件,同时合理运用剪枝策略提升效率。文章附有Go语言实现代码,助你掌握回溯算法的核心思想。
663 0
|
存储 算法 Java
leetcode算法题-有效的括号(简单)
【11月更文挑战第5天】本文介绍了 LeetCode 上“有效的括号”这道题的解法。题目要求判断一个只包含括号字符的字符串是否有效。有效字符串需满足左括号必须用相同类型的右括号闭合,并且左括号必须以正确的顺序闭合。解题思路是使用栈数据结构,遍历字符串时将左括号压入栈中,遇到右括号时检查栈顶元素是否匹配。最后根据栈是否为空来判断字符串中的括号是否有效。示例代码包括 Python 和 Java 版本。
507 4
LeetCode第26题删除有序数组中的重复项
这篇文章介绍了LeetCode第26题"删除有序数组中的重复项"的解题方法,通过使用双指针技巧,高效地去除数组中的相邻重复元素。
LeetCode第26题删除有序数组中的重复项
LeetCode第80题删除有序数组中的重复项 II
文章介绍了LeetCode第80题"删除有序数组中的重复项 II"的解法,利用双指针技术在O(1)空间复杂度内原地删除重复元素,并总结了双指针技术在处理有序数组问题中的应用。
LeetCode第80题删除有序数组中的重复项 II
【LeetCode-每日一题】 删除排序数组中的重复项
【LeetCode-每日一题】 删除排序数组中的重复项
266 4
|
算法 C++
Leetcode第二十二题(括号生成)
这篇文章讨论了如何使用递归算法解决LeetCode第22题“括号生成”的问题,提供了两种C++的实现方法,目的是生成所有有效的括号组合。
325 0
Leetcode第二十二题(括号生成)
LeetCode第88题合并两个有序数组
文章分享了LeetCode第88题"合并两个有序数组"的解法,通过从后向前的合并策略避免了数组元素的前移,使用三个指针高效地完成了合并过程。
【LeetCode 48】108.将有序数组转换为二叉搜索树
【LeetCode 48】108.将有序数组转换为二叉搜索树
226 0