leetcode hot100刷题日记——18.搜索插入位置

我忏悔,昨天偷懒了就做了一道题,今天把昨天没做的补上呜呜呜
在这里插入图片描述
自己的啰嗦版本解答:

class Solution {
public:
    bool isValid(string s) {
        stack<char> st;
        if(s.length()==1){
            return false;
        }
        for(char ss:s){
        	//左边括号就放进栈
            if(ss=='('||ss=='{'||ss=='['){
                st.push(ss);
            }else{
            	//遍历到右边括号的时候,先判断栈是不是空的。栈非空时,弹出栈顶元素,如果括号匹配的话,弹出来的左括号一定和这个右括号匹配。不匹配就直接return false。
            	//如果栈是空的,那就说明前面没有左括号,那就把右括号先放进栈里,反正也弹不出来。
                if(ss==')'){
                    if(!st.empty()){
                        char topp=st.top();
                        st.pop();
                        if(topp!='('){
                            return false;
                        }
                    }else{
                        st.push(ss);
                    }
                }else if(ss=='}'){
                    if(!st.empty()){
                        char topp=st.top();
                        st.pop();
                        if(topp!='{'){
                            return false;
                        }
                    }else{
                        st.push(ss);
                    }
                }else{
                    if(!st.empty()){
                        char topp=st.top();
                        st.pop();
                        if(topp!='['){
                            return false;
                        }
                    }else{
                        st.push(ss);
                    }
                }
            }
        }
        //最后看栈是不是空的,是空的就说明都匹配上了。不是空的那就是之前还有没匹配的括号,return false。
        if(st.empty())
            return true;
        else
            return false;
    }
};

时间复杂度:O(N)
空间复杂度:O(N)

下面学习一下大大的写法。
灵茶山艾府大大写法详解见link

首先括号两两一对,那么s的长度必须是偶数,如果是奇数,那就直接return false。

创建一个哈希表,保存每个右括号对应的左括号,这样可以直接判断栈顶的左括号是否与右括号为同一类型,省去if-else判断

class Solution{
	unordered_map<char, char> mp = {{')', '('}, {']', '['}, {'}', '{'}};
	public:
		bool isValid(string s){
			if(s.length()%2!=0){
				return false;
			}
			stack<char>st;
			for(char c:s){
				//判断c是不是mp的key
				//也就是判断c是不是右括号
				if(!mp.contains(c)){
					//如果不是右括号,那就是左括号,放进栈里
					st.push(c);
				}else{
					if(st.empty()||st.top()!=mp[c]){
					//如果是右括号的话
					//首先判断栈是不是空,如果是空的话,说明没有匹配的左括号,return false
					//接着还要想到如果栈不是空的,我们要判断栈顶的括号是不是匹配的
						return false;
					}
					//前面已经判断过了,所以栈一定是非空的,而且栈顶是对应括号,所以弹出栈顶元素
					st.pop();
				}
			}
			return st.empty();
		}
};
### LeetCode Hot100 技巧与策略 LeetCodeHot100 是许多程序员提升算法能力的重要资源之一。以下是针对该部分的一些技巧和策略: #### 1. **制定合理的计划** - 推荐按照一定的顺序进行,例如优先完成热 HOT 100 和精选 TOP 面试[^1]。这些目覆盖了大部分常见的算法知识点和技术面试考点。 - 将目按难度分类(简单、中等、困难),逐步攻克不同层次的挑战。 #### 2. **利用辅助工具提高效率** - 借助公子龙大佬开发的网站及其插件功能[^2],可以更高效地查找解思路并学习经典算法框架。 - 插件能够帮助用户快速定位到某类问的核心解决方法,减少无谓的时间浪费。 #### 3. **注重总结归纳** - 对于每一道做过的目,都应该尝试分析其背后的通用模式以及可能的变化形式[^4]。比如环形链表的相关变种问(如回文链表)往往具有相似逻辑结构。 - 定期整理笔记,记录下自己容易遗忘的知识点或者巧妙的解决方案。 #### 4. **模拟真实场景训练** - 如果目标是为了准备技术面试,则建议模仿实际考试环境来进行限时答练习[^5]。这样不仅可以锻炼思维敏捷度还能增强抗压能力。 - 同时也要关注时间复杂度空间复杂度优化等方面的要求。 #### 5. **积极参与社区讨论** - 加入像寸铁这样的优质创作者所创建的学习小组或论坛,与其他志同道合者共同探讨难解答方案。 - 学习他人优秀的思维方式有助于拓宽视野开阔眼界。 下面提供一段简单的 Python 实现代码作为例子展示如何处理其中一类常见数据结构——链表的操作: ```python class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next def hasCycle(head: ListNode) -> bool: slow = fast = head while fast and fast.next: slow = slow.next # Move one step at a time. fast = fast.next.next # Move two steps at once. if slow == fast: # If there's an intersection point found. return True return False # No cycle detected after traversal completes. ``` 此函数用于检测单向链表是否存在闭环现象,采用双指针法实现。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值