Growth in 2 dimensions python

I was doing an assessment for job interview. One of the 3 problems that I had to solve in an hour was finding the maximal value in a grid where you traverse it and add 1 to the elements based on the coordinates given. I spent a little to much time on the second problem and only ended up with about 20 minutes for this one. I didn't finish it in time so it's bugging me.

I just want to make sure that the solution to the problem as I remember it is optimized.

The input is a String array of two int values and the dimension of the grid.

To illustrate, if the coordinates given are [3,2] [2,2] [1,3] then

[1][1][0]     
[1][1][0]     
[1][1][0]     

[1][1][0]     
[2][2][0]     
[2][2][0]     

[1][1][0]
[2][2][0]
[3][3][1]

and so on...

I believe the required result was the maximal value that is not in [1,1] and the number of times it exists in the grid.

This is the the solution I came up with. Is there any way to optimize it?

public static List twoDimensions[String[] coordinates, int n] {

    List maxAndCount = new ArrayList[];
    int[][] grid = new int[n][n];
    int arrLength = coordinates.length;
    int max = Integer.MIN_VALUE;
    int count = 1;

    for [int i = 0; i < arrLength; i++] {

        String[] coors = coordinates[i].split[" "];
        int row = Integer.parseInt[coors[0]];
        int column = Integer.parseInt[coors[1]];

        for [int j = 0; j < row; j++] {
            for [int k = 0; k < column; k++] {

                grid[j][k] += 1;
                System.out.println["grid [" + j + "," + k + "]: " + grid[j][k]];

                if [![j == 0 & k == 0] && grid[j][k] > max] {

                    max = grid[j][k];
                    count = 1;

                } else if [grid[j][k] == max] {

                    count++;

                }
            }
        }
    }

    maxAndCount.add[max];
    maxAndCount.add[count];

    return maxAndCount;
}

public static void main[String[] args] {

    String[] coors = { "1 3", "2 4", "4 1", "3 2" };
    System.out.println["The Max and count Are:" + twoDimensions[coors, 4].toString[]];
}

Python provides many ways to create 2-dimensional lists/arrays. However one must know the differences between these ways because they can create complications in code that can be very difficult to trace out. Let’s start by looking at common ways of creating 1d array of size N initialized with 0s.

Using 2D arrays/lists the right way

Method 1: Creating a 1-D list

Example 1: Creating 1d list Using Naive methods

Python3

Example 2: creating 1d list using  List Comprehension

Python3

N = 5

arr = [0 for i in range[N]]

print[arr]

Explanation:

Here we are multiplying the number of rows to the empty list and hence a entire list is created with every element is zero.

Method 2 Creating a 2-D list

Example 1: Naive Method

Python3

rows, cols = [5, 5]

arr = [[0]*cols]*rows

print[arr]

Output

[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]

Explanation: 

Here we are multiplying the number of columns  and hence we are getting the 1-D list of size equal to number of columns and then multiplying it with the number of rows which results in the creation of a 2-D list.

Example 2: Using List Comprehension

Python3

rows, cols = [5, 5]

arr = [[0 for i in range[cols]] for j in range[rows]]

print[arr]

Output

[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]

Explanation:

Here we are basically using the concept of list comprehension and applying loop for list inside a list and hence creating a 2-D list.

Example 3: Using empty list

Python3

arr=[]

rows, cols=5,5

for i in range[rows]:

    col = []

    for j in range[cols]:

        col.append[0]

    arr.append[col]

print[arr]

Output

[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]

Explanation:

Here we are appending zeros as elements for number of columns times and then appending this 1-D list into the empty row list and hence creating the 2-D list.

Python3

rows, cols = [5, 5]

arr = [[0]*cols]*rows

arr[0][0] = 1

for row in arr:

    print[row]

arr = [[0 for i in range[cols]] for j in range[rows]]

arr[0][0] = 1

for row in arr:

    print[row]

Output

[1, 0, 0, 0, 0]
[1, 0, 0, 0, 0]
[1, 0, 0, 0, 0]
[1, 0, 0, 0, 0]
[1, 0, 0, 0, 0]
[1, 0, 0, 0, 0]
[0, 0, 0, 0, 0]
[0, 0, 0, 0, 0]
[0, 0, 0, 0, 0]
[0, 0, 0, 0, 0]

Explanation:

We expect only the first element of first row to change to 1 but the first element of every row gets changed to 1 in method 2a. This peculiar functioning is because Python uses shallow lists which we will try to understand.
In method 1a, Python doesn’t create 5 integer objects but creates only one integer object and all the indices of the array arr point to the same int object as shown.

If we assign the 0th index to a another integer say 1, then a new integer object is created with the value of 1 and then the 0th index now points to this new int object as shown below

Similarly, when we create a 2d array as “arr = [[0]*cols]*rows” we are essentially the extending the above analogy. 

  1. Only one integer object is created. 
  2. A single 1d list is created and all its indices point to the same int object in point 1. 
  3. Now, arr[0], arr[1], arr[2] …. arr[n-1] all point to the same list object above in point 2.

The above setup can be visualized in the image below.

Now lets change the first element in first row of “arr” as arr[0][0] = 1

  • arr[0] points to the single list object we created we above.[Remember arr[1], arr[2] …arr[n-1] all point to the same list object too].
  • The assignment of arr[0][0] will create a new int object with the value 1 and arr[0][0] will now point to this new int object.[and so will arr[1][0], arr[2][0] … arr[n-1][0]]

This can be clearly seen in the below image. 

So when 2d arrays are created like this, changing values at a certain row will effect all the rows since there is essentially only one integer object and only one list object being referenced by the all the rows of the array.

As you would expect, tracing out errors caused by such usage of shallow lists is difficult. Hence the better way to declare a 2d array is 

Python3

rows, cols = [5, 5]

print[[[0 for i in range[cols]] for j in range[rows]]]

Output

[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]

This method creates 5 separate list objects unlike method 2a. One way to check this is using the ‘is’ operator which checks if the two operands refer to the same object. 

Python3

rows, cols = [5, 5]

arr = [[0 for i in range[cols]] for j in range[rows]]

print[arr[0] is arr[1]]

arr = [[0]*cols]*rows

print[arr[0] is arr[1]]


Can a python list be 2 dimensional?

Python provides many ways to create 2-dimensional lists/arrays. However one must know the differences between these ways because they can create complications in code that can be very difficult to trace out.

What is a 2 dimensional array in python?

2D array in Python Programming is a nested data structure, meaning it is a set of arrays inside another array . 2D array is mostly used to represent data in tabular or two dimensional format.

How do you create a two

Insert.py.
# Write a program to insert the element into the 2D [two dimensional] array of Python..
from array import * # import all package related to the array..
arr1 = [[1, 2, 3, 4], [8, 9, 10, 12]] # initialize the array elements..
print["Before inserting the array elements: "].
print[arr1] # print the arr1 elements..

How do I iterate a two

First, the list is assigned to a variable called data. Then we use a for loop to iterate through each element in the range of the list. Unless we specify a starting index for the range, it defaults to the first element of the list. This is index 0, and it's what we want in this case.

Chủ Đề