给定两个整数i和j ,任务是打印可以通过以下螺旋方式填充矩阵获得的第i * j个矩阵元素:
例子:
Input: i = 3, j = 4
Output: 12
Explanation:
i = 3, j = 4 and grid[3][4] = 12
Input: i = 5, j = 5
Output: 21
Explanation:
i = 5, j = 5 grid[5][5] = 21
方法:在问题中,可以观察到,当i是第一个偶数时是i 2 (2 2 = 4 in 2nd row),当i是奇数第一个数时是(i-1 ) 2 + 1 ((3-1) 2 + 1 = 5 在第三行)。类似地,当j是奇数时,网格中的第一个数字是j 2 (第 3 列中的 3 2 = 9),当j是偶数时,网格中的第一个数字是(j-1) 2 + 1 ((4-1) 2 + 1 = 第 4 列中的 10)。所以每一行都以i 2或(i-1) 2 + 1开头,每列以j 2或(j-1) 2 + 1开头。
问题可以分为以下几种情况:
- 情况 1 : i = j
观察网格的对角线元素可以用公式i 2 – (i-1)或j 2 – (j – 1) 表示。 - 情况 2:i > j
- 情况 1:我是偶数
在这种情况下,第i行的第一个编号将是i 2 。现在通过从行的第一个数字中减去(j – 1)计算给定索引处的值。所以公式将是i 2 – (j-1) 。 - 情况 2:我是奇数
在这种情况下,第i行的第一个编号将是(i – 1) 2 + 1 。现在通过将(j – 1)添加到行的第一个数字,计算给定索引处的值。所以公式将是(i – 1) 2 + 1 + (j – 1) 。
- 情况 1:我是偶数
- 情况 3:i < j
- 情况 1:j 是偶数
在这种情况下,第j列的第一个数字将为(j – 1) 2 + 1 。现在通过将(i – 1)添加到列的第一个数字,计算给定索引处的值。所以公式将是(j – 1) 2 + 1 + (i – 1) 。 - 情况 2:j 是奇数
在这种情况下,第j列的第一个数字将为j 2 。现在通过从列的第一个数字中减去(i – 1)计算给定索引处的值。所以公式将是j 2 + 1 – (i – 1) 。
- 情况 1:j 是偶数
请按照以下步骤解决问题:
- 检查i是否等于j并打印i * i – (i – 1) 。
- 如果i大于j :
- 如果i甚至打印i * i – (j – 1) 。
- 否则,打印 ( i – 1)* (i – 1) + 1 + (j – 1) 。
- 如果j大于i :
- 如果j是偶数打印(j – 1) * (j – 1) + 1 + (i – 1) 。
- 否则,打印j * j – (i – 1) 。
下面是上述方法的实现:
C++
// C++ program for the above approach
#include
using namespace std;
// Function to the find
// element at (i, j) index
int findInGrid(int i, int j)
{
if (i == j)
return (i * i - (i - 1));
else if (i > j) {
if (i % 2 == 0)
return i * i - (j - 1);
else
return (i - 1) * (i - 1) + 1 + (j - 1);
}
else {
if (j % 2 == 0)
return (j - 1) * (j - 1) + 1 + (i - 1);
else
return j * j - (i - 1);
}
}
// Driver Code
int main()
{
int i = 3, j = 4;
// Function Call
cout << findInGrid(i, j);
return 0;
}
Java
// Java program for the above approach
import java.io.*;
class GFG{
// Function to the find
// element at (i, j) index
static int findInGrid(int i, int j)
{
if (i == j)
return (i * i - (i - 1));
else if (i > j)
{
if (i % 2 == 0)
return i * i - (j - 1);
else
return (i - 1) * (i - 1) +
1 + (j - 1);
}
else
{
if (j % 2 == 0)
return (j - 1) * (j - 1) +
1 + (i - 1);
else
return j * j - (i - 1);
}
}
// Driver Code
public static void main(String[] args)
{
int i = 3, j = 4;
// Function Call
System.out.println(findInGrid(i, j));
}
}
// This code is contributed by Dharanendra L V
Python3
# Python3 program for the above approach
# Function to the find
# element at(i, j) index
def findInGrid(i, j):
if (i == j):
return (i * i - (i - 1))
elif (i > j):
if (i % 2 == 0):
return i * i - (j - 1)
else :
return ((i - 1) * (i - 1) +
1 + (j - 1))
else:
if (j % 2 == 0):
return ((j - 1) * (j - 1) +
1 + (i - 1))
else:
return j * j - (i - 1)
# Driver Code
i = 3
j = 4
# Function Call
print(findInGrid(i, j))
# This code is contributed by Dharanendra L V
C#
// C# program for the above approach
using System;
class GFG{
// Function to the find
// element at (i, j) index
static int findInGrid(int i, int j)
{
if (i == j)
return (i * i - (i - 1));
else if (i > j)
{
if (i % 2 == 0)
return i * i - (j - 1);
else
return (i - 1) * (i - 1) +
1 + (j - 1);
}
else
{
if (j % 2 == 0)
return (j - 1) * (j - 1) +
1 + (i - 1);
else
return j * j - (i - 1);
}
}
// Driver Code
static public void Main()
{
int i = 3, j = 4;
// Function Call
Console.WriteLine(findInGrid(i, j));
}
}
// This code is contributed by Dharanendra L V
Javascript
输出
12
时间复杂度: O(1)
辅助空间: O(1)
如果您想与行业专家一起参加直播课程,请参阅Geeks Classes Live