LeetCode简单题——20、21、26、27

Leetcode-20 有效的括号(简单)

给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。

思路:

  1. 将(),{},[] 放入到HashMap中存储

  2. 借用栈存储扫描内容

    为什么要使用栈呢?

    栈:后进先出,最近匹配。匹配最近符合的括号,形成一对。

  3. 从头开始扫描,依次放入栈中,若扫描到的字符能够与栈顶元素匹配成功,形成一对括号,移除栈顶元素,继续扫描

  4. 扫描结束,若栈中无元素,表示所给字符括号全部完全匹配

class Solution {

  private HashMap<Character, Character> mappings;

  public Solution() {
    this.mappings = new HashMap<Character, Character>();
    this.mappings.put(')', '(');
    this.mappings.put('}', '{');
    this.mappings.put(']', '[');
  }

  public boolean isValid(String s) {
      
    Stack<Character> stack = new Stack<Character>();
	//使用栈存放未匹配过的字符
      
    for (int i = 0; i < s.length(); i++) {
      char c = s.charAt(i);
      if (this.mappings.containsKey(c)) {
          // Map是否包含 ),},] 
        char topElement = stack.empty() ? '#' : stack.pop();
          //如果栈为空 topElement = ‘#’,否则就弹出栈顶元素作为topElement的值
        if (topElement != this.mappings.get(c)) {
            // 如果topElement(栈顶元素) 和 c应该匹配的值是一样的,那么就匹配成功
            // 如果不一样,表示匹配失败了,就直接返回flase 
          return false;
        }
      } else {
        //匹配成功,执行该分支,将c加入栈顶,即:c是未匹配过的字符
        stack.push(c);
      }
    }
    return stack.isEmpty();
  }
}

参考链接:https://leetcode-cn.com/problems/valid-parentheses/solution/you-xiao-de-gua-hao-by-leetcode/

Leetcode-21 合并两个有序链表

输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4

思路:(归并排序,递归)

  1. 将两个链表分别抽象为一个个单独的元素。(两个链表记为L1,L2)

  2. 对比两个链表的头结点的值,如果L1的头结点的值比L2的小,那么就把L1的头结点单独出来

  3. 接着比对L1的next 与L2的头节点的值谁大谁小,小的值作为L1的next

    (就是在刨除L1的头结点后,在剩下的元素中对于最小的两个元素比谁大谁小,即重复2的过程,也就是开始递归)

  4. 比较完所有元素递归就应该结束了

  5. 此时已经形成了一个排好序的链表。

  6. 那此时我应该返回的是哪个链表呢?L1?L2?

    返回非空链表

class Solution {
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        if (l1 == null) {
            return l2;
        }
        else if (l2 == null) {
            return l1;
        }
        else if (l1.val < l2.val) {
            l1.next = mergeTwoLists(l1.next, l2);
            return l1;
        }
        else {
            l2.next = mergeTwoLists(l1, l2.next);
            return l2;
        }

    }
}

参考链接:https://leetcode-cn.com/problems/merge-two-sorted-lists/solution/he-bing-liang-ge-you-xu-lian-biao-by-leetcode/
来源:力扣(LeetCode)

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

给定数组 nums = [1,1,2], 

函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。 

你不需要考虑数组中超出新长度后面的元素。(要求原地工作)

思路:(双指针法)

  1. i,j 借助两个指针,i = 0; nums[i] = 首元素,j从1开始,进行循环<nums.length
  2. 判断第二个元素 是否等于一个元素,如果等于即表示出现重复元素,i不变
  3. 若第三个元素不等于第二个元素,表示nums[2]未重复,让i++,把第二个元素赋值为第三个元素。
  4. 用指针i 来记录元素是否重复,如果未重复i++,重复了i就不变,保证nums[i]是未重复数组的最后一个元素。
public int removeDuplicates(int[] nums) {
    if (nums.length == 0) return 0;
    int i = 0;
    for (int j = 1; j < nums.length; j++) {
        if (nums[j] != nums[i]) {
            i++;
            nums[i] = nums[j];
        }
    }
    return i + 1;
}

参考链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/solution/shan-chu-pai-xu-shu-zu-zhong-de-zhong-fu-xiang-by-/
来源:力扣(LeetCode)

Leetcode-27 移除元素

给定 nums = [3,2,2,3], val = 3,

函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。

你不需要考虑数组中超出新长度后面的元素。

思路:(双指针法,类似与26题)

  1. i,j 两个指针,i = 0,j = 0;
  2. j = 0;开始循环,如果nums[i ] == val , 什么都不做,如果nums[i] != val, nums[i] = nums[j] ,i++
  3. i 表示的是不该去除元素组成的数组下标,j表示整个数组下标
public int removeElement(int[] nums, int val) {
    int i = 0;
    for (int j = 0; j < nums.length; j++) {
        if (nums[j] != val) {
            nums[i] = nums[j];
            i++;
        }
    }
    return i;
}

参考链接:https://leetcode-cn.com/problems/remove-element/solution/yi-chu-yuan-su-by-leetcode/
来源:力扣(LeetCode)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值