Algorithmic Thinking


Strategy
- Talk loud
- Always say and actually do it
  -- Let me check it again

Checking
-- loop invariant, loop variables: like p = p.next;

What data structures to use:
 - Stack
- PriorityQueue
- TreeMap, TreeSet


Starts from simple solution that works
- First brute force DFS
- brute force DFS + Cache: (easier to write)
- DP

- Save state, existing already known info, use them

X. Left, right array
Scan from left to right or from right to left
Map lastPosMap

left[], right[] maintains some value till current index (ending at idx)

Mistakes/Bugs to check:
- Return right result
- index, or element value?
- do again after while loop

Edge Cases:
- Check code,
  - ==null, whether element can be null
- Element is null
- What if the NestedInteger can be null

Misc
- Map: preSum:index

TreeSet
- floor, higher
TreeMap
- lowerKey, higherKey
- lowerEntry, ceilingEntry

Arrays
- binarySearch
Interval[] sortedIntervals = Arrays.copyOf(intervals,intervals.length);

Character
.isDigit

X. Left right array
Scan from left to right or from right to left
O(N)
- left[], right[]: right[] is not really needed
- leftMin[], LeftMax[], rightMin[], rightMax[]
- the array maintains some value till current index (ending at idx)
  -- runningSum/Product

Lintcode 45 - Maximum Subarray Difference
Find two non-overlapping subarrays A and B, which |SUM(A) - SUM(B)| is the largest.

LeetCode 238 - Product of Array Except Self

Given an array arr[], find the maximum j - i such that arr[j] > arr[i]
- leftMin[], rightMax

Maximum Length Bitonic Subarray
- O(1) space: end, start

Related: Longest Bitonic Subsequence
- DP lis[], lds[]

LeetCode 42 - Trapping Rain Water
- two pointers, left, right and maintain leftMax, rightMax
int min = Math.min(leftMax[i], rightMax[i]);
if (height[i] < min) {
  volume += min - height[i];
}
- ordered stack
- leftMax[], rightMax[]

Related: LeetCode 407 - Trapping Rain Water II
- BFS + PriorityQueue
- Add borders first

LeetCode 11 - Container With Most Water
- two pointers

Labels

adsense (5) Algorithm (69) Algorithm Series (35) Android (7) ANT (6) bat (8) Big Data (7) Blogger (14) Bugs (6) Cache (5) Chrome (19) Code Example (29) Code Quality (7) Coding Skills (5) Database (7) Debug (16) Design (5) Dev Tips (63) Eclipse (32) Git (5) Google (33) Guava (7) How to (9) Http Client (8) IDE (7) Interview (88) J2EE (13) J2SE (49) Java (186) JavaScript (27) JSON (7) Learning code (9) Lesson Learned (6) Linux (26) Lucene-Solr (112) Mac (10) Maven (8) Network (9) Nutch2 (18) Performance (9) PowerShell (11) Problem Solving (11) Programmer Skills (6) regex (5) Scala (6) Security (9) Soft Skills (38) Spring (22) System Design (11) Testing (7) Text Mining (14) Tips (17) Tools (24) Troubleshooting (29) UIMA (9) Web Development (19) Windows (21) xml (5)