Task Scheduler

Move zeroes:

class Solution {
    public void moveZeroes(int[] nums) {

        // 2 pointers
        // point i: record current
        // point pos: reocrd non zero    
        int pos = 0;
        for (int i = 0; i < nums.length; i++) {            
            if (nums[i] != 0) {
                nums[pos] = nums[i];
                pos++;
            }
        }

        while (pos < nums.length) {
            nums[pos] = 0;
            pos++;
        }        
    }
}

Add binary

  • from end to start
  • use carry
class Solution {
    public String addBinary(String a, String b) {

        int i = a.length() - 1;
        int j = b.length() - 1;
        int carry = 0;        
        StringBuilder sb = new StringBuilder();

        while (i >= 0 || j >= 0) {
            int sum = carry;            
            if (i >= 0) sum += a.charAt(i--) - '0';
            if (j >= 0) sum += b.charAt(j--) - '0';
            sb.append(sum % 2);
            carry = sum / 2;                        
        }

        if (carry != 0) sb.append(carry);
        return sb.reverse().toString();
    }
}

Binary Tree Vertical Order Traversal

public List<List<Integer>> verticalOrder(TreeNode root) {
        // Write your code here
        List<List<Integer>> ans = new ArrayList<>();
        if (root == null) {
            return ans;
        }

        Map<Integer, List<Integer>> hash = new HashMap<>();
        Queue<Integer> qCol = new LinkedList<>();
        Queue<TreeNode> qNode = new LinkedList<>();

        qCol.offer(0);
        qNode.offer(root);

        while (!qCol.isEmpty()) {                      // bfs
            int c = qCol.poll();
            TreeNode node = qNode.poll();

            hash.putIfAbsent(c, new ArrayList<>());
            hash.get(c).add(node.val);

            if (node.left != null) {
                qCol.offer(c - 1);
                qNode.offer(node.left);
            }
            if (node.right != null) {
                qCol.offer(c + 1);
                qNode.offer(node.right);
            }
        }

        for (int i = Collections.min(hash.keySet()); i <= Collections.max(hash.keySet()); i++) {
            ans.add(hash.get(i));
        }
        return ans;
    }

Meeting Rooms ii

  • sort by start time
  • heap: track the earliest end meet
  • append meeting if next meeting just follow the meeting the heap
  • sweep line, merge interval, insert interval
class Solution {
    public int minMeetingRooms(Interval[] intervals) {

        if(intervals == null || intervals.length == 0) return 0;

        Arrays.sort(intervals, (i1, i2) -> (i1.start - i2.start));
        PriorityQueue<Interval> heap = new PriorityQueue<>(intervals.length, (i1, i2) -> (i1.end - i2.end));        

        heap.add(intervals[0]);

        for (int i = 1; i < intervals.length; i++) {    // NOTE: can not start from 0, cf merge interval. 
                                                        // 0 means, interval[0] will be added twice 

            Interval interval = heap.poll();            

            if (intervals[i].start >= interval.end) {
                interval.end = intervals[i].end;
            } else {
                heap.add(intervals[i]);
            }
            heap.add(interval);
        }

        return heap.size();
    }
}
public class Solution {
    public int minMeetingRooms(Interval[] intervals) {
        if(intervals == null || intervals.length == 0) return 0;
        Arrays.sort(intervals, (a, b) -> (a.start - b.start));
        int max = 0;
        PriorityQueue<Interval> queue = new PriorityQueue<>(intervals.length, (a, b) -> (a.end - b.end));
        for(int i = 0; i < intervals.length; i++){
            while(!queue.isEmpty() && intervals[i].start >= queue.peek().end)
                queue.poll();
            queue.offer(intervals[i]);
            max = Math.max(max, queue.size());
        }
        return max;
    }
}
  • sweep line
class Solution {

    private class Event {
    int time;
    int status;

    public Event(int time, int status) {
        this.time = time;
        this.status = status;
    }
}

    public int minMeetingRooms(Interval[] intervals) {

        List<Event> list = new ArrayList<>();

        for (Interval interval : intervals) {
            list.add(new Event(interval.start, 1));
            list.add(new Event(interval.end, 0));
        }

        Collections.sort(list,((e1, e2) -> 
                               (e1.time != e2.time ? e1.time - e2.time : e1.status - e2.status)));

        int count = 0;
        int max = 0;
        for (Event event : list) {
            if (event.status == 1) {
                count++;
            } else {
                count--;
            }
            max = Math.max(max, count);
        }
        return max;

    }
}

Meeting Room:

class Solution {
    public boolean canAttendMeetings(Interval[] intervals) {

        if (intervals == null || intervals.length == 0) return true;

        Arrays.sort(intervals, (a,b) -> a.start - b.start);
        Interval last = intervals[0];

        for (int i = 1; i < intervals.length; i++) {
            if (intervals[i].start < last.end) return false;
            last.end = Math.max(last.end, intervals[i].end);
        }

        return true;        
    }
}

results matching ""

    No results matching ""