从零开始的 leetcode 之旅

从零开始,此前没有任何算法竞赛经验,没有系统刷过题

4 Likes

加油!楼主要坚持啊,暑假一起刷(


基本没做过,启动!

完全没做过,启动!

数据结构与算法,启动!

暑假?

今晚蒜了。因为刚刚突然在群里聊嗨了一直聊到现在。

良好的开始:rofl:加油捏,寒假一起刷:rofl_kissing_heart:

时间挤不出来一点:sob:

太吊了。一个 easy 也不会

做了两道有意思的题
Linked List Cycle - LeetCode
Linked List Cycle II - LeetCode

做了。

141. Linked List Cycle

public class Solution {
  public boolean hasCycle(ListNode head) {
    ListNode fast = head, slow = head;
    while (fast != null && fast.next != null && slow != null) {
      fast = fast.next.next;
      slow = slow.next;
      if (fast == slow) {
        return true;
      }
    }
    return false;
  }
}

142. Linked List Cycle II

这个有点 tricky。要求空间复杂度 O(1) ,又不让 modify linked list。于是看了下讨论区,发现真的是 tricky。

public class Solution {
  public ListNode detectCycle(ListNode head) {
    ListNode fast = head, slow = head;
    while (fast != null && fast.next != null && slow != null) {
      fast = fast.next.next;
      slow = slow.next;
      if (fast == slow) {
        while (slow != head) {
          head = head.next;
          slow = slow.next;
        }
        return head;
      }
    }
    return null;
  }
}
2 Likes

877. Stone Game

有点好笑,这个难度为 medium 的题目,答案就只有一行:

class Solution {
  public boolean stoneGame(int[] piles) {
    return true;
  }
}

主要看证明:因为 piles.length 为偶数,所以 Alice 每次都可以选择是拿奇数列还是偶数列,而 Bob 没有选择权利。如果所有奇数 pile 的值之和大于偶数的,那 Alice 每次都拿奇数 index 的,那么 Bob 每次都只能拿偶数 index 的,所以 Alice 永远会赢。and vice versa.

1 Like

草,我 142 第一次做的太直接了,但是还好能 ac(

public class Solution {
    public ListNode detectCycle(ListNode head) {
        ListNode detected = head;// 要被判断是否是开始循环的结点
        while (detected != null) {    // 下同 141 题 判断是否有循环
            ListNode slow = detected;
            ListNode fast = detected;
            while (fast != null && fast.next != null ) {
                slow = slow.next;
                fast = fast.next.next;
                // 同时判断是否回到要被判断的结点
                if (slow == detected || fast == detected) {
                    return detected;
                }
                if (slow == fast) {
                    break;
                }
            }
            detected = detected.next;
        }
        return null;
    }
}

然后喜提速度最慢一档。后看了讨论区的方法,服了

trade off of time and space. 为了空间有点太舍弃时间了,还不如做标记位(

感觉你这个 worst case time complexity 有 O(N^2)

1 Like

我每日一题呢 :wink:

12. Integer to Roman

怎么又是无脑题目

class Solution {

    public String intToRoman(int num) {
        StringBuilder roman = new StringBuilder();
        
        if (num / 1000 > 0) {
            roman.append("M".repeat(num / 1000));
            num %= 1000;
        }
        if (num >= 900) {
            roman.append("CM");
            num -= 900;
        }
        if (num >= 500) {
            roman.append("D");
            num -= 500;
        }
        if (num >= 400) {
            roman.append("CD");
            num -= 400;
        }
        if (num / 100 > 0) {
            roman.append("C".repeat(num / 100));
            num %= 100;
        }
        if (num >= 90) {
            roman.append("XC");
            num -= 90;
        }
        if (num >= 50) {
            roman.append("L");
            num -= 50;
        }
        if (num >= 40) {
            roman.append("XL");
            num -= 40;
        }
        if (num / 10 > 0) {
            roman.append("X".repeat(num / 10));
            num %= 10;
        }
        if (num >= 9) {
            roman.append("IX");
            num -= 9;
        }
        if (num >= 5) {
            roman.append("V");
            num -= 5;
        }
        if (num >= 4) {
            roman.append("IV");
            num -= 4;
        }
        if (num > 0) {
            roman.append("I".repeat(num));
        }
        return roman.toString();
    }
}

当然写法可以优化

1 Like

debug 还要花钱,烂完了。

看 OI wiki 复习了一下 hash table,原来算法竞赛中常用的冲突处理方法是 separate chaining

1 Like

1. Two Sum

我太成功了,真的。彻底成功。

class Solution {

    public int[] twoSum(int[] nums, int target) {
        int n = nums.length;
        Map<Integer, Integer> m = new HashMap<Integer, Integer>();

        for (int i = 0; i < n; i++) {
            if (m.containsKey(target - nums[i])) return new int[] {i, m.get(target - nums[i])};
            m.put(nums[i], i);
        }
        return null;
    }
}
1 Like