LeetCode
  • Introduction
  • Design
    • 348. Design Tic-Tac-Toe
    • 534. Design TinyURL
    • 535. Encode and Decode TinyURL
    • 346. Moving Average from Data Stream
    • 281. Zigzag Iterator
    • 381. Insert Delete GetRandom O(1) - Duplicates allowed
    • 432. All O`one Data Structure
    • 341. Flatten Nested List Iterator
    • 642. Design Search Autocomplete System
    • 170. Two Sum III - Data structure design
    • 622. Design Circular Queue
    • 295. Find Median from Data Stream
  • OOD
    • 146.LRU Cache(Amazon)
  • Sort
    • Bucket Sort
      • 791. Custom Sort String
      • 347. Top K Frequent Elements
      • 1057. Campus bikes
    • 280. Wiggle Sort
    • 75. Sort Colors
  • Binary Search
    • 278. First Bad Version
    • 162. Find Peak Element in O(logn)
    • LintCode 183. Wood Cut
    • 33. Search in Rotated Sorted Array
    • 81. Search in Rotated Sorted Array II
    • 153. Find Minimum in Rotated Sorted Array
    • 154. Find Minimum in Rotated Sorted Array II
    • 34. Find First and Last Position of Element in Sorted Array
    • Count number of occurrences (or frequency) in a sorted array
    • 378. Kth Smallest Element in a Sorted Matrix
    • 240. Search a 2D Matrix II
    • 658. Find K Closest Elements
    • 410. Split Array Largest Sum
  • Data Structure
    • Arrays
      • Two Pointer
        • 11. Container With Most Water
      • 283. Move Zeros
      • 26. Remove Duplicates from Sorted Array
      • 88. Merge Sorted Array
      • 683. K Empty Slots
      • 4. Median of Two Sorted Arrays
      • Interval
        • 56. Merge Interval
        • 57. Insert Interval
      • 54. Spiral Matrix
      • 48. Rotate Image(Amazon, MicroSoft, Apple)
      • 448. Find All Numbers Disappeared in an Array
      • 228. Summary Ranges
      • 289. Game of Life
      • 298. Product of Array Except Self
      • 825. Friends of Appropriate Ages
    • Stack
      • Postfix to Infix
      • 155. Min Stack
      • 716. Max Stack
      • 388. Longest Absolute File Path
      • 316. Remove Duplicate Letters
      • 636. Exclusive Time of Functions
      • Calculator Series
        • 227. Basic Calculator
        • 772. Basic Calculator III
    • Trie
      • 208. Implement Trie (Prefix Tree)
      • 211. Add and Search Word - Data structure design
      • 336. Palindrome Pairs
      • 212. Word Search II
    • Heap
      • 218. The Skyline Problem
      • 23. Merge k Sorted Lists
      • 252. Meeting Rooms
      • 253. Meeting Rooms II
      • 215. Kth Largest Element in an Array
      • 692. Top K Frequent Words
      • 373. Find K Pairs with Smallest Sums
    • Deque
      • 239. Sliding Window Maximum
    • Map
      • 128. Longest Consecutive Sequence
      • 350. Intersection of Two Arrays II
      • 760. Find Anagram Mappings
    • Segment Tree / Binary Indexed Tree
      • 308. Range Sum Query 2D - Mutable
      • 218. The Skyline Problem
      • 315. Count of Smaller Numbers After Self
      • 308. Range Sum Query 2D - Mutable
      • 493. Reverse Pairs
    • Linked List
      • 19. Remove Nth Node From End of List
      • 24. Swap Nodes in Pairs
      • 160. Intersection of Two Linked Lists
      • 138. Copy List with Random Pointer
      • 143. Reorder List
      • 445. Add Two Numbers II
    • Tree
      • BST
        • 109. Convert Sorted List to Binary Search Tree
        • 285. Inorder Successor in BST
        • Convert Binary Search Tree (BST) to Sorted Doubly-Linked List
        • Construct Binary Tree from Inorder and Postorder Traversal
      • 101. Symmetric Tree
      • 105. Construct Binary Tree from Preorder and Inorder Traversal
      • 106. Construct Binary Tree from Inorder and Postorder Traversal
      • 110. Balanced Binary Tree
      • 129. Sum Root to Leaf Numbers
      • 199. Binary Tree Right Side View
      • 257. Binary Tree Paths
      • 543. Diameter of Binary Tree
      • Sum Root to Leaf Numbers
    • Hash Table
      • 325. Maximum Size Subarray Sum Equals k
      • 314. Binary Tree Vertical Order Traversal
    • Union-Find
      • 721. Accounts Merge
      • 305. Number of Islands II
      • 323. Number of Connected Components in an Undirected Graph
      • 261. Graph Valid Tree
      • 947. Most Stones Removed with Same Row or Column
    • Linked List
      • 138. Copy List with Random Pointer
      • 21. Merge Two Sorted Lists
      • 23. Merge K Sorted Lists
      • 206. Reverse Linked List
      • 237. Delete Node in a Linked List
      • 141. Linked List Cycle
      • 142. Linked List Cycle II
      • 148. Sort List
      • 708. Insert into a Cyclic Sorted List
  • Graph
    • BFS/DFS
      • Topological Sort
        • 207. Course Schedule
        • 210. Course Schedule II
        • 133. Clone Graph
        • 675. Cut Off Trees for Golf Event
        • 269. Alien Dictionary
      • BackTracking
        • 39. Combination Sum
        • 40. Combination Sum II
        • 79. Word Search
        • 212. Word Search II
        • 282. Expression Add Operators
      • Memoization
        • 329. Longest Increasing Path in a Matrix
      • 733. Flood Fill
      • 279. Perfect Squares
      • 200. Number of Islands (Amazon)
      • 694. Number of Distinct Islands
      • 711. Number of Distinct Islands II
      • 98. Validate Binary Search Tree
      • 785. Is Graph Bipartite?
      • 491. Increasing Subsequences
      • 51. N-Queens
      • 52. N-Queens II
      • 286. Walls and Gates
      • 111. Minimum Depth of Binary Tree
      • 753. Craking the Safe
    • 399. Evaluate Division
    • 127. Word Ladder
    • 126. Word Ladder II
    • 339. Nested List Weight Sum
  • Traversal
    • 297. Serialize and Deserialize Binary Tree
    • 236. Lowest Common Ancestor of a Binary Tree
    • 235. Lowest Common Ancestor of a Binary Search Tree
    • 144. Binary Tree Preorder Traversal
    • 255. Verify Preorder Sequence in Binary Search Tree
    • 94. Binary Tree Inorder Traversal
    • 145. Binary Tree Post Order Traversal
    • 102. Level Order Traversal
    • 103. Binary Tree Zipzag Level Order Traversal
    • 107. Binary Tree Level Order Traversal
    • 156. Binary Upside Down
    • 173. Binary Search Tree Iterator
    • 99. Recover Binary Search Tree
    • Morris Traversal
    • 498. Diagonal Traverse
    • Flatten
      • Flatten Binary Tree to Linked List
  • Math
    • Bit Manipulation
      • 231. Power of Two
      • 393. UTF-8 Validation
      • 371. Sum of Two Integers
    • 463. Island Perimeter
    • 50. Pow(x,n)
    • 326. Power of Three
    • 67. Add Binary
    • 29. Divide Two Integers
    • 360. Sort Transformed Array
    • 247. Strobogrammatic Number II
    • 277. Find the Celebrity
    • 246. Strobogrammatic Number
    • 415. Add Strings
    • 398. Reservoir Sampling
    • 43. Multiply Strings
    • 311. Sparse Matrix Multiplication
    • 8. String to Integer (Atoi)
    • 7. Reverse Integer
    • 829. Consecutive Numbers Sum
    • MiniMax
      • Guess the Word
  • Sum
    • 1. Two Sum
    • 167. Two Sum II - Input array is sorted
    • 15. 3Sum
    • 16. 3Sum Closest
    • 18. 4Sum
    • 454. 4Sum II
    • Path sum
      • 124. Binary Tree Maximum Path Sum
      • 113. Path Sum II
      • 437. Path Sum III
    • 209. Minimum Size Subarray Sum
    • 862. Shortest Subarray with Sum at Least K
    • 560. Subarray Sum Equals K
    • 523. Continuous Subarray Sum
  • Parentheses
    • 20. Valid Parentheses
    • 32. Longest Valid Parentheses
    • 301. Remvoe Invalid Parenthesis
    • 678. Valid Parenthesis String
  • String
    • Substring Search
      • 3. Longest Substring Without Repeating Characters
      • 438. Find All Anagrams in a String
      • 76. Minimum Window Substring
      • 30. Substring with Concatenation of All Words
      • 159. Longest Substring with At Most Two Distinct Characters
      • 340. Longest Substring with At Most K Distinct Characters
      • 395. Longest Substring with At Least K Repeating Characters
    • 12. Integer to Roman
    • 13. Roman to Integer
    • 44. Wildcard Matching
    • 242. Valid Anagram
    • 49. Group Anagrams
    • 657. Judge Route Circle
    • 482. License Key Formatting
    • 681. Next Closet Time
    • 387. First Unique Character in a String
    • 426. Convert Binary Search Tree to Sorted Doubly Linked List
    • 273. Integer to English Words
    • 157. Read N Characters Given Read4
    • 158. Read N Characters Given Read4 II - Call multiple times
    • 480. Valid Word Abbreviation
    • 409. Longest Palindrome
    • 680. Valid Palindrome II
    • 125. Valid Palindrome
    • 468. Validate IP Address
    • 161. One Edit Distance
    • 38. Count and Say
    • 1096. Brace Expansion II
  • Greedy
    • 630. Course Schedule III
    • 621. Task Scheduler
    • 358. Rearrange String k Distance Apart
    • 406. Queue Reconstruction by Height
    • 316. Remove Duplicate Letters
    • 767. Reorganize String
  • Dynamic Programming
    • Palindromic Substring
      • 5. longest Palindromic Substring
    • Subarray
      • 53. Maximum Subarray
      • 152. Maximum Product Subarray
    • Backpack problem
      • Backpack I
      • Backpack II
      • Backpack III
      • Backpack IV
      • Backpack V
      • Backpack VI aka: Combination Sum IV
      • Coin Change 2
    • 70. Climbing Stairs
    • 10. Regular Expression Matching
    • 91. Decode Ways
    • 338. Counting Bits
    • 121. Best Time to Buy and Sell Stock
    • 122. Best Time to Buy and Sell Stock II
    • 123. Best Time to Buy and Sell Stock III
    • 139. Word Break
    • 140. Word Break II
    • 198. House Robber
    • 72. Edit Distance
    • 221. Maximal Square
    • 84. Largest Rectangle in Histogram
    • 312. Burst Balloons
    • 304. Range Sum Query 2D - Immutable
    • 518. Coin Change 2
    • Longest Arithmetic Progression
    • 975. Odd Even Jump
    • 1066. Campus Bikes II
  • JingChi.ai
    • Word Composition
    • Sliding Window Median
    • 537. Erect the Fence (Convex Hull Problem)
    • LintCode 558: Sliding Window Matrix Maximum
    • orienteering game
    • 扫雷
  • Twitter
    • Identifying Triangle
    • Last and Second-Last
    • 300. Longest increasing subsequence
    • Twin String
    • 647. Number of palindromic substring
    • Wildcard Matching
  • Akuna
    • C++ Intern
    • V1
    • V2
    • Cut the Sticks
    • Quant Dev
    • Postfix_to_infix
    • Drone Delivery
    • phone
  • LintCode Contest
    • Ask For Cooling Time
  • SQL
    • 176. Second Highest Salary
    • 597. Friend Requests I: Overall Acceptance Rate
  • FB 19
    • Convert Binary Search Tree (BST) to Sorted Doubly-Linked List
    • 3Sum
    • Minimum Window Substring
    • Count number of occurrences (or frequency) in a sorted array
    • Count NO2
    • Valid Palindrome
    • Merge k Sorted Lists
    • Kth Largest Element in an Array
    • Move Zeros
    • Remove Invalid Parenthesis
    • friends
    • Integer to English
    • Islands
    • Valid Palindrome
    • sec
      • Longest Increasing Path in a Matrix
      • Product of Array Except Self
      • Binary Tree Vertical Order Traversal
      • Add Binary
      • Valid Parentheses
      • sup
        • 128. Longest Consecutive Sequence
        • Combination Sum II
        • Add and Search Word - Data structure design
        • feb
  • Google 20
    • 410. Split Array Largest Sum
  • 818. Race Card
Powered by GitBook
On this page

Was this helpful?

  1. JingChi.ai

537. Erect the Fence (Convex Hull Problem)

PreviousSliding Window MedianNextLintCode 558: Sliding Window Matrix Maximum

Last updated 5 years ago

Was this helpful?

here are some trees, where each tree is represented by (x,y) coordinate in a two-dimensional garden. Your job is to fence the entire garden using theminimum lengthof rope as it is expensive. The garden is well fenced only if all the trees are enclosed. Your task is to help find the coordinates of trees which are exactly located on the fence perimeter.

Example 1:

Input:
 [[1,1],[2,2],[2,0],[2,4],[3,3],[4,2]]

Output:
 [[1,1],[2,0],[4,2],[3,3],[2,4]]

Explanation:

Example 2:

Input:
 [[1,2],[2,2],[4,2]]

Output:
 [[1,2],[2,2],[4,2]]

Explanation:

Even you only have trees in a line, you need to use rope to enclose them.

Note:

  1. All trees should be enclosed together. You cannot cut the rope to enclose trees that will separate them in more than one group.

  2. All input integers will range from 0 to 100.

  3. The garden has at least one tree.

  4. All coordinates are distinct.

  5. Input points have NO order. No order required for output.

Thoughts:

  1. Find the next convex "base" point, expand the co-linear points with it by using the Cross Product. (reason)

  2. Repeat doing this until the graph traverses back to the original point.

  3. Time Complexity of three Algorithm:

    Jarvis

    Graham Scan

    Andrew's Monotone Chain

    Divide and Conquer

    O(n^2)

    O(nlogn)

    O(nlogn)

    O(n^3)

Note: Cross Product = 0 <=> 1. there is a zero vector (current point reaches the base point) 2. two vectors are parallel (or anti-parallel, the angle between is either 0 or 180 degree)

Code Monotone Chain:

1. sort points based on the x value as first priority, then y value
2. build the lower hull: compare the cross product of second_last, last and current point, if negative, means the
previous vec made the clockwise turn, at which we should get rid of the last value as it is not a eligible vertex.
3. build the upper hull: repeat the step 2 with reversely traversing the vector.
class Solution {
public:
    int orientation(Point &p, Point &q, Point &r) {
        return (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y);
    }

    vector<Point> outerTrees(vector<Point>& points) {
        if (points.size() <= 3)
            return points;

        //sort lexicographically
        sort(points.begin(), points.end(), [](Point &p, Point &q) {
            return p.x < q.x || (p.x == q.x && p.y < q.y);
        });

        vector<Point> ans;

        //lower hull 
        for (int i = 0; i < points.size(); ++i) {
            while (ans.size() >= 2 && orientation(ans[ans.size() - 2], ans[ans.size() - 1], points[i]) < 0)
                ans.pop_back();
            ans.push_back(points[i]);
        }
        // remove the last point as it will be included in the upper hull
        ans.pop_back();

        // upper hull
        for (int i = points.size() - 1; i >= 0; --i) {
            while (ans.size() >= 2 && orientation(ans[ans.size() - 2], ans[ans.size() - 1], points[i]) < 0)
                ans.pop_back();
            ans.push_back(points[i]);
        }

        // remove the last point as it was included as the first point explored;
        ans.pop_back();
        return ans;
    }
};
  1. class Solution {
    public:
        vector<Point> outerTrees(vector<Point>& points) {
            // Andrew's monotone chain method
            int n = points.size();
            vector<Point> ans;
            sort(points.begin(), points.end(), mycompare);
            // left to right
            for (int i = 0; i < n; ++i) {
                while (ans.size() > 1 && orientation(ans[ans.size()-2], ans.back(), points[i]) < 0) 
                    ans.pop_back();
                ans.push_back(points[i]);
            }
            // if all points along a line, ans.size() is n after left to right procedure
            if (ans.size() == n) return ans;
            // right to left
            for (int i = n-2; i >= 0; --i) {
                while (ans.size() > 1 && orientation(ans[ans.size()-2], ans.back(), points[i]) < 0) 
                    ans.pop_back();
                ans.push_back(points[i]);
            }
            ans.pop_back();
            return ans;
        }
    private:
        static bool mycompare(Point& a, Point& b) {
            return a.x < b.x || (a.x == b.x && a.y < b.y);
        }
        int orientation(Point& a, Point& b, Point& c) {
            return (b.x-a.x)*(c.y-b.y) - (b.y-a.y)*(c.x-b.x);
        }
    };
     vector<Point> outerTrees(vector<Point>& points) {
        if(points.size() < 3) return points;
        auto cmp = [](Point& a, Point& b) -> bool {
            return a.x < b.x || (a.x == b.x && a.y < b.y);
        };
        sort(points.begin(), points.end(), cmp);
        vector<Point> stack;
        stack.push_back(points[0]);
        stack.push_back(points[1]);
        //left to right;
        for(int i = 2; i < points.size(); ++i) {
            while(stack.size() > 1) {
                auto &t1 = stack.back();
                auto &t2 = stack[stack.size() - 2];
                if(isRightTurn(t2, t1, points[i])) break;
                else stack.pop_back();
            }
            stack.push_back(points[i]);
        }
        int n = stack.size();
        if(n == points.size()) return stack; //check if linear
        stack.push_back(points[points.size() - 2]);
        //right to left;
        for(int i = points.size() - 3; i >= 0; --i) {
            while(stack.size() > n) {
                auto &t1 = stack.back();
                auto &t2 = stack[stack.size() - 2];
                if(isRightTurn(t2, t1, points[i])) break;
                else stack.pop_back();
            }
            stack.push_back(points[i]);
        }
        stack.pop_back();
        return stack;
    }

    bool isRightTurn(Point &a, Point &b, Point &c) {
        return (b.x - a.x) * (c.y - a.y) - (b.y - a.y) * (c.x - a.x) <= 0;
    }

Code Monotone Chain (Python):

def outerTrees(self, A):
    def sign(p, q, r):
        return cmp((p.x - r.x)*(q.y - r.y), (p.y - r.y)*(q.x - r.x))

    def drive(hull, r):
        hull.append(r)
        while len(hull) >= 3 and sign(*hull[-3:]) < 0:
            hull.pop(-2)
        return hull

    A.sort(key = lambda p: (p.x, p.y))
    lower = reduce(drive, A, [])
    upper = reduce(drive, A[::-1], [])
    return list(set(lower + upper))

Code Graham Scan:

1)Find the bottom-most point by comparing y coordinate of all points. If there are two points with same y value, then the point with smaller x coordinate value is considered. Let the bottom-most point be P0. Put P0 at first position in output hull.
2)Consider the remaining n-1 points and sort them by polor angle in counterclockwise order around points[0]. If polor angle of two points is same, then put the nearest point first.
3After sorting, check if two or more points have same angle. If two more points have same angle, then remove all same angle points except the point farthest from P0. Let the size of new array be m.
4)If m is less than 3, return (Convex Hull not possible)
5)Create an empty stack ‘S’ and push points[0], points[1] and points[2] to S.
6)Process remaining m-3 points one by one. Do following for every point ‘points[i]’
4.1)Keep removing points from stack while
orientation
of following 3 points is not counterclockwise (or they don’t make a left turn).
            a) Point next to top in stack
            b) Point at the top of stack
            c) points[i]
4.2)Push points[i] to S
5)Print contents of S
/**
 * Definition for a point.
 * struct Point {
 *     int x;
 *     int y;
 *     Point() : x(0), y(0) {}
 *     Point(int a, int b) : x(a), y(b) {}
 * };
 */
class Solution {


    struct pointsComparator{
        Point p0;
        bool operator() (const Point & p1, const Point& p2){
            int o = orientation(p0, p1, p2);
            if(o == 0) return distSq(p0, p2)>= distSq(p0, p1);
            return o == 2;
        }

        pointsComparator(Point p): p0(p){}
    };
//     int compare(const void *vp1, const void *vp2){
//         Point *p1 = (Point *) vp1;
//         Point *p2 = (Point *) vp2;
//     }

    static int distSq(Point p1, Point p2) {
        return (p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y);
    }

   static int orientation(Point a, Point b, Point c){
        int val = (b.x - a.x)*(c.y-b.y) - (b.y - a.y)*(c.x - b.x);
        if(val == 0) return 0;
        return (val > 0)? 2:1;
    }

    // Point nextTotop(stack<Point> &s){
    //     Point p = s.top();
    //     s.pop();
    //     Point res = s.top();
    //     s.push(p);
    //     return res;
    // }

    // void swap(Point &p1, Point& p2){
    //      Point temp = p1;
    //      p1 = p2;
    //      p2 = temp;
    // }
public:
  vector<Point> outerTrees(vector<Point> points) {
        int n = points.size();
        if (n <= 3) {
            return points;
        }
        // Find the bottommost point
        int ymin = points[0].y, min = 0;
        for (int i = 1; i < n; i++) {
            int y = points[i].y;
            // Pick the bottom-most or chose the left most point in case of tie
            if ((y < ymin) || (ymin == y && points[i].x < points[min].x)) {
                ymin = points[i].y, min = i;
            }
        }

        // Place the bottom-most point at first position
        Point temp = points[0];
        points[0] = points[min];
        points[min] = temp;

        // Sort n-1 points with respect to the first point.
        // A point p1 comes before p2 in sorted ouput 
        // if p2 has larger polar angle (in counterclockwise direction) than p1
        // In the tied case, the one has smaller distance from p0 comes first
        Point p0 = points[0];
        sort(points.begin(), points.end(), pointsComparator(p0));
        //As we need to output all the vertices instead of extreme points
        //We need to sort the points with the same largest polar angle w.r.p. p0 in another way to break tie
        //Closer one comes last
        Point pn = points.back();        
        if (orientation(p0, points[1], pn) != 0) {
            int idx = n-1;
            while (orientation(p0, points[idx], pn) == 0) {
                idx--;
            }
            reverse(points.begin() + idx + 1, points.end());
        }

        // Create an empty stack and push first three points to it.
        vector<Point> vertices;
        vertices.push_back(points[0]);
        vertices.push_back(points[1]);
        vertices.push_back(points[2]);
        // Process remaining n-3 points
        for (int i = 3; i < n; i++) {
            // Keep removing top while the angle formed by
            // points next-to-top, top, and points[i] makes a right (in clockwise) turn
            while (orientation(vertices[vertices.size() - 2], vertices.back(), points[i]) == 1) {
                vertices.pop_back();
            }
            vertices.push_back(points[i]);
        }
        return vertices;
    }

};

Code Javis's Algorithm (Java)

public class Solution {
    public List<Point> outerTrees(Point[] points) {
        Set<Point> result = new HashSet<>();

        // Find the leftmost point
        Point first = points[0];
        int firstIndex = 0;
        for (int i = 1; i < points.length; i++) {
            if (points[i].x < first.x) {
                first = points[i];
                firstIndex = i;
            }
        }
        result.add(first);

        Point cur = first;
        int curIndex = firstIndex;
        do {
            Point next = points[0];
            int nextIndex = 0;
            for (int i = 1; i < points.length; i++) {
                if (i == curIndex) continue;
                int cross = crossProductLength(cur, points[i], next);
                if (nextIndex == curIndex || cross > 0 ||
                        // Handle collinear points
                        (cross == 0 && distance(points[i], cur) > distance(next, cur))) {
                    next = points[i];
                    nextIndex = i;
                }
            }
            // Handle collinear points
            for (int i = 0; i < points.length; i++) {
                if (i == curIndex) continue;
                int cross = crossProductLength(cur, points[i], next);
                if (cross == 0) {
                    result.add(points[i]);
                }
            }

            cur = next;
            curIndex = nextIndex;

        } while (curIndex != firstIndex);

        return new ArrayList<Point>(result);
    }

    private int crossProductLength(Point A, Point B, Point C) {
        // Get the vectors' coordinates.
        int BAx = A.x - B.x;
        int BAy = A.y - B.y;
        int BCx = C.x - B.x;
        int BCy = C.y - B.y;

        // Calculate the Z coordinate of the cross product.
        return (BAx * BCy - BAy * BCx);
    }

    private int distance(Point p1, Point p2) {
        return (p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y);
    }
}

This is essentially with co-linear checks. (Other ways to solve convex Hull include , , and )

Other two comparable solutions: , .

Special Thanks to 's and by , and for providing Monotone Chain and equivalent by , along with alternative solution by , and by .

Jarvis'algorithm (or wrapping)
Graham Scan
Simple Divide and Conquer Algorithm
1
2
shawngao
solution
solution
GeeksforGeeks
lee215
aeonaxx
Solution
Python solution
awice
1
zestypanda
2
hwf