🥑
Codding Problems Solutions
  • Introduction
  • CodeWars ⚔️
    • 🌝Beta
      • Count vowels
      • Who am I?
    • 🎒8 Kyu
      • Get the mean of an array
      • Multiply
      • SQL Basics: Mod
    • 🎁7 Kyu
      • 80's Kids #2: Help ALF Find His Spaceship
      • Complementary DNA
      • GROCERY STORE: Inventory
      • Get the Middle Character
      • Growth of a Population
      • Highest and Lowest
      • Indexed capitalization
      • Jaden Casing Strings
      • Moves in squared strings (I)
      • SQL with Harry Potter: Sorting Hat Comparators
      • SQL: Regex String to Table
      • Shortest Word
      • Sorted? yes? no? how?
      • String ends with?
      • Sum of odd numbers
      • Sum of the first nth term of Series
      • Two to One
      • What time is it?
    • 🎩6 Kyu
      • Are they the "same"?
      • Backspaces in string
      • Banker's Plan
      • Bouncing Balls
      • Count the smiley faces!
      • Counting Duplicates
      • Delete occurrences of an element if it occurs more than n times
      • Dubstep
      • Framed Reflection
      • Is a number prime?
      • Linked Lists - Length & Count
      • Lottery Ticket
      • Maze Runner
      • Mexican Wave
      • Number Format
      • Persistent Bugger.
      • Playing with digits
      • Replace With Alphabet Position
      • SQL Basics: Simple EXISTS
      • SQL Basics: Simple HAVING
      • SQL Basics: Simple IN
      • Statistics for an Athletic Association
      • The Deaf Rats of Hamelin
      • Tortoise racing
      • Unique In Order
      • Who likes it?
    • 🎯5 Kyu
      • Double Cola
      • Integers: Recreation One
      • Maximum subarray sum
      • Moving Zeros To The End
      • Pete, the baker
      • Pick peaks
      • Product of consecutive Fib numbers
      • Rot13
      • The Hunger Games - Zoo Disaster!
      • Using Window Functions To Get Top N per Group
      • Variadic Parameter Pack Count
    • 💍4 Kyu
      • Matrix Determinant
      • Memoized Log Cutting
      • Range Extraction
      • Roman Numerals Helper
      • Simple Fun #159: Middle Permutation
      • Strip Comments
      • Sum of Intervals
      • The observed PIN
      • Tuple sum
  • LeetCode 🍃
    • 👌Easy
      • Backspace String Compare
      • Binary Search
      • Binary Tree Tilt
      • Check If N and Its Double Exist
      • Climbing Stairs
      • Complement of Base 10 Integer
      • Consecutive Characters
      • Contains Duplicate
      • Convert Binary Number in a Linked List to Integer
      • Count and Say
      • Defanging an IP Address
      • Delete Node in a Linked List
      • Duplicate Zeros
      • Excel Sheet Column Number
      • Fibonacci Number
      • Find All Numbers Disappeared in an Array
      • Find Numbers with Even Number of Digits
      • Find the Difference
      • First Unique Character in a String
      • Fizz Buzz
      • Goat Latin
      • Height Checker
      • Implement strStr()
      • Intersection of Two Arrays II
      • Invert Binary Tree
      • Jewels and Stones
      • Kids With the Greatest Number of Candies
      • Length of Last Word
      • Longest Common Prefix
      • Longest Word in Dictionary
      • Max Consecutive Ones
      • Maximum Depth of Binary Tree
      • Merge Sorted Array
      • Merge Two Sorted Lists
      • Middle of the Linked List
      • Minimum Depth of Binary Tree
      • Move Zeroes
      • N-th Tribonacci Number
      • Number of 1 Bits
      • Number of Good Pairs
      • Number of Recent Calls
      • Palindrome Number
      • Pascal's Triangle II
      • Path Sum
      • Plus One
      • Power of Four
      • Power of Two
      • Remove Duplicates from Sorted Array
      • Remove Element
      • Replace Elements with Greatest Element on Right Side
      • Reverse Bits
      • Reverse Integer
      • Reverse String
      • Roman to Integer
      • Running Sum of 1d Array
      • Shuffle the Array
      • Single Number
      • Sort Array By Parity
      • Squares of a Sorted Array
      • Sum of Left Leaves
      • Sum of Root To Leaf Binary Numbers
      • Symmetric Tree
      • Tenth Line
      • Third Maximum Number
      • Transpose Matrix
      • Two Sum
      • Valid Anagram
      • Valid Mountain Array
      • Valid Parentheses
      • Word Pattern
      • XOR Operation in an Array
    • 👊Medium
      • All Elements in Two Binary Search Trees
      • Asteroid Collision
      • Binary Tree Inorder Traversal
      • Binary Tree Level Order Traversal
      • Binary Tree Postorder Traversal
      • Binary Tree Preorder Traversal
      • Bulls and Cows
      • Car Pooling
      • Combination Sum
      • Combination Sum III
      • Compare Version Numbers
      • Counting Bits
      • Course Schedule II
      • Design Linked List
      • Gas Station
      • House Robber
      • Image Overlap
      • Insert Interval
      • Insert into a Binary Search Tree
      • Insertion Sort List
      • K-diff Pairs in an Array
      • Kth Largest Element in an Array
      • Longest Substring Without Repeating Characters
      • Lowest Common Ancestor of a Binary Tree
      • Majority Element II
      • Maximum Difference Between Node and Ancestor
      • Maximum Product Subarray
      • Minimum Domino Rotations For Equal Row
      • Minimum Number of Arrows to Burst Balloons
      • Random Point in Non-overlapping Rectangles
      • Remove Covered Intervals
      • Rotate Array
      • Rotate Image
      • Rotate List
      • Rotting Oranges
      • Serialize and Deserialize BST
      • Sort List
      • String to Integer (atoi)
      • Teemo Attacking
      • Top K Frequent Elements
      • Valid Sudoku
    • 💪Hard
      • Median of Two Sorted Arrays
      • Parsing A Boolean Expression
      • Recover Binary Search Tree
      • Stone Game IV
Powered by GitBook
On this page
  • Rotting Oranges
  • Solutions
  • 🧠 Cpp

Was this helpful?

  1. LeetCode 🍃
  2. Medium

Rotting Oranges

PreviousRotate ListNextSerialize and Deserialize BST

Last updated 4 years ago

Was this helpful?

You are given an m x n grid where each cell can have one of three values:

  • 0 representing an empty cell,

  • 1 representing a fresh orange, or

  • 2 representing a rotten orange.

Every minute, any fresh orange that is 4-directionally adjacent to a rotten orange becomes rotten.

Return the minimum number of minutes that must elapse until no cell has a fresh orange. If this is impossible, return -1.

Example 1:


Input: grid = [[2,1,1],[1,1,0],[0,1,1]]
Output: 4

Example 2:


Input: grid = [[2,1,1],[0,1,1],[1,0,1]]
Output: -1
Explanation: The orange in the bottom left corner (row 2, column 0) is never rotten, because rotting only happens 4-directionally.

Example 3:


Input: grid = [[0,2]]
Output: 0
Explanation: Since there are already no fresh oranges at minute 0, the answer is just 0.

Constraints:

  • m == grid.length

  • n == grid[i].length

  • 1 <= m, n <= 10

  • grid[i][j] is 0, 1, or 2.

Solutions

🧠 Cpp

class Solution
{    
enum state{empty, fresh, rotten};
public:
    template<state state_to_check>
    bool is_cell(int i, int j, vector<vector<int>>& grid)
    {
        try
        {
            return grid.at(i).at(j) == state_to_check;
        }
        catch(const std::out_of_range)
        {
            return true;
        }
    }

    bool check_siders_is_present(int i, int j, vector<vector<int>>& g)
    {
        bool is_present = is_cell<empty>(i,j,g) || is_cell<rotten>(i,j,g) ? true :
           !(is_cell<empty>(i+1,j,g) && is_cell<empty>(i-1,j,g) 
             && is_cell<empty>(i,j+1,g) && is_cell<empty>(i,j-1,g));
        return is_present;
    }

    int orangesRotting(vector<vector<int>>& g)
    {
        //input check
        //if(g.size() == 1 && g[0].size() ==1 )
          //  return g[0][0] == rotten ? 0 : -1;

        //there is no cut off oranges
        for(int i = 0; i < g.size(); i++)
        for(int j = 0; j < g[i].size(); j++)
            if(check_siders_is_present(i,j,g) == false)
                return -1;

        //there is at least one rotten
        bool rotten_is_present = false,
             fresh_is_present = false;
        for(auto line : g)
        {
            if(count(line.begin(), line.end(), rotten))
            {
                rotten_is_present = true;
            }
            if(count(line.begin(), line.end(), fresh))
            {
                fresh_is_present = true;
            }
        }
        if(!rotten_is_present)
            return fresh_is_present ? -1 : 0;

        //start iteration
        vector<vector<int>> grid(g);
        queue<pair<int,int>> to_rot;
        bool all_rotten = false;
        size_t minutes = 0;

        auto rot_if_fresh = [&grid, &all_rotten](int i, int j)
        {
            try
            {
                if (grid.at(i).at(j) == fresh)
                {
                    grid[i][j] = rotten;
                    all_rotten = false;
                }
            }
            catch(const std::out_of_range){}
        };

        while(!all_rotten)
        {
            all_rotten = true; 
            for(int i = 0; i < grid.size(); i++)
            for(int j = 0; j < grid[i].size(); j++)
            {
                if(grid[i][j] == rotten)
                    to_rot.push({i,j});
            }

            while(!to_rot.empty()) 
            {
                auto p = to_rot.front(); to_rot.pop();

                int i = p.first, j = p.second;
                rot_if_fresh(i+1,j);
                rot_if_fresh(i-1,j);
                rot_if_fresh(i,j+1);
                rot_if_fresh(i,j-1);
            }

            if(!all_rotten)
                minutes++;

        }

        fresh_is_present = false;
        for(auto line : grid)
        if(count(line.begin(), line.end(), fresh))
        {
            fresh_is_present = true;
        }
        return fresh_is_present ? -1 : minutes;

    }
};
👊
Rotting Oranges