📜  在螺旋矩阵中查找指定索引处的元素

📅  最后修改于: 2021-09-03 03:37:39             🧑  作者: Mango

给定两个整数ij ,任务是打印可以通过以下螺旋方式填充矩阵获得的i * j矩阵元素:

螺旋网格表示图 1

例子:

方法:在问题中,可以观察到,当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)
  • 情况 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. 检查i是否等于j并打印i * i – (i – 1)
  2. 如果i大于j
    1. 如果i甚至打印i * i – (j – 1)
    2. 否则,打印 ( i – 1)* (i – 1) + 1 + (j – 1)
  3. 如果j大于i
    1. 如果j是偶数打印(j – 1) * (j – 1) + 1 + (i – 1)
    2. 否则,打印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