在螺旋矩阵中找到指定索引处的元素
原文:https://www . geesforgeks . org/find-the-element-at-specified-index-in-a-spiral-matrix/
给定两个整数 i 和 j ,任务是打印 i * j 第个矩阵元素,可以通过以下螺旋方式填充矩阵得到:
螺旋网格表示图 1
示例:
输入: i = 3,j = 4 输出: 12 说明: i = 3,j = 4,网格【3】【4】= 12
输入: i = 5,j = 5 输出: 21 说明: i = 5,j = 5 格【5】【5】= 21
进场:在问题中可以观察到当 i 为偶数时网格中的第一个数字为 i 2 (2 2 =第二排 4),当 i 为奇数时网格中的第一个数字为(I-1)2+1((3-1)2+1 =第三排 5)。同样,当 j 为奇数时,网格中的第一个数字为j2(32=第 3 列中的 9),当 j 为偶数时,网格中的第一个数字为(j-1)2+1((4-1)2+1 =第 4 列中的 10)。所以每一行从I2T35】或 (i-1) 2 + 1 开始,每一列从 j 2 或 (j-1) 2 + 1 开始。
问题可分为以下几种情况:
- 情况 1 : i = j 观察到网格的对角线元素可以用公式I2–(I-1)或j2–(j–1)表示。
- 案例 2: i > j
- 情况 1:我是偶数 在这种情况下,第一排我将是我2T8】。现在通过从第一行的数字中减去(j–1),计算给定索引处的值。所以公式为I2–(j-1)。
- 情况 2: i 为奇数 在这种情况下,第一排 i 将为(I–1)2+1。现在,通过将(j–1)添加到行的第一个数字,计算给定索引处的值。所以公式为(I–1)2+1+(j–1)。
- 案例 3: i < j
- 情况 1: j 为偶数T2 在这种情况下,第一列 j 将为(j–1)2+1。现在,通过将(I–1)添加到列的第一个数字,计算给定索引处的值。所以公式为(j–1)2+1+(I–1)。
- 情况 2: j 为奇数 在这种情况下,第一列 j 将为 j 2 。现在通过从列的第一个数字中减去(I–1),计算给定索引处的值。所以公式为j2+1 –( I–1)。
按照以下步骤解决问题:
- 检查 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 <iostream>
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
Python 3
# 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
java 描述语言
<script>
// Javascript program for the above approach
// Function to the find
// element at (i, j) index
function findInGrid(i, 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
let i = 3, j = 4;
// Function Call
document.write(findInGrid(i, j));
</script>
Output
12
时间复杂度: O(1) 辅助空间: O(1)
版权属于:月萌API www.moonapi.com,转载请注明出处