• [lettcode top 100] 0917 两数之和,有效的括号


    目录

    1. 两数之和

    20 有效的括号


    1. 两数之和

    1. 两数之和 - 力扣(LeetCode)

    给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。

    思路:

    暴力解法,双层循环

    1. class Solution:
    2. def twoSum(self, nums: List[int], target: int) -> List[int]:
    3. n = len(nums)
    4. for i in range(n):
    5. for j in range(i+1,n):
    6. if nums[i] +nums[j] == target:
    7. return [i,j]

    优化:

    使用哈希表,可以降低查询target-num时候的复杂度:O(n)->O(1)。(具体为什么能降低,这是哈希表的知识)。将num逐步放入哈希表中,之后target-num在哈希表中寻找。(c++ and python)

    1. class Solution:
    2. def twoSum(self, nums: List[int], target: int) -> List[int]:
    3. # 哈希表
    4. hashtable = {}
    5. for i,num in enumerate(nums):
    6. if target - num in hashtable:
    7. return [i,hashtable[target-num]]
    8. hashtable[num] = i
    9. return []
    1. class Solution {
    2. public:
    3. vector<int> twoSum(vector<int>& nums, int target) {
    4. //使用map;存储{index,value};
    5. int n = nums.size();
    6. unordered_map<int,int> hastable;
    7. for (int i = 0;i < n;i++){
    8. if (hastable.find(target-nums[i]) != hastable.end()){
    9. return {i,hastable[target-nums[i]]};
    10. }
    11. hastable[nums[i]] = i;
    12. }
    13. return {};
    14. }
    15. };

    python中的哈希表:dict;collections.OrderedDict()

    cpp中的哈希表:unordered_map;unordered_set;

    20 有效的括号

    20. 有效的括号

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

    有效字符串需满足:

    1. 左括号必须用相同类型的右括号闭合。
    2. 左括号必须以正确的顺序闭合。
    3. 每个右括号都有一个对应的相同类型的左括号。

    思路:

    使用栈来处理括号顺序(有效括号的问题);维护一个栈,将‘(’,‘[’,‘{’压入到栈中,使用字典,通过 ')':'(', '}':'{',']':'['   dict[key]与栈中元素匹配。(c++ and python)

    1. class Solution {
    2. public:
    3. bool isValid(string s) {
    4. //使用栈
    5. int n = s.length();
    6. if (n % 2) return false;
    7. unordered_map<char,char> mp = {
    8. {')','('},
    9. {'}','{'},
    10. {']','['}
    11. };
    12. stack<char> stk;
    13. for (char& ch:s){
    14. if (mp.count(ch)){
    15. if (stk.empty() || mp[ch] != stk.top()){
    16. return false;
    17. }
    18. stk.pop();
    19. }
    20. else stk.push(ch);
    21. }
    22. return stk.empty();
    23. }
    24. };
    1. class Solution:
    2. def isValid(self, s: str) -> bool:
    3. n = len(s)
    4. if (n % 2): return False
    5. stack = []
    6. pairs = {
    7. ')':'(',
    8. ']':'[',
    9. '}':'{'
    10. }
    11. for ch in s:
    12. if ch in pairs:
    13. if not stack or pairs[ch] != stack[-1]:
    14. return False
    15. stack.pop()
    16. else:stack.append(ch)
    17. return not stack

  • 相关阅读:
    CTF竞赛题目类型
    MySQL:10-设计数据库
    游戏开发中的“御用中介“
    C++学习之旅 第一章 C++预备知识
    CMake教程-第 8 步:添加自定义命令和生成文件
    LVS负载均衡群集
    Linux内核的配置和编译(2)——Linux内核下载与配置
    [MapStruct]关于Mapping的高级选项
    Linux入门学习 —— 常用的基本命令(上)
    vue3组件外使用route
  • 原文地址:https://blog.csdn.net/weixin_51449137/article/details/126912501