我在leetcode上超出数组索引范围

时间:2018-08-03 07:36:39

标签: java

我正在尝试解决问题:

编写一种高效的算法,在m x n矩阵中搜索值。该矩阵具有以下属性:

每行中的整数从左到右排序。 每行的第一个整数大于前一行的最后一个整数。

输入: 矩阵=

[

[1、3、5、7],

[10,11,16,20],

[23,30,34,50]

]

target = 3

输出:true

我写的代码是:

library(dplyr)
library(plotly)

##
Produits<-c("Crème de jour","sérum","Crème de nuit","masque","démaquillant à rincer",
            "démaquillant sans rincage","lotion","eau florale","huile","produits teintés")
Pourcentages<-c(27.1,14.5,13.8,8.82,7.73,7.24,6.57,5.83,5.65,2.82)
colors<-c("#ff0000","#ff1919","#ff3232","#ff4c4c","#ff6666",
          "#ff7f7f","#ff9999","#ffb2b2","#ffcccc","#ffe5e5")

Data<-data.frame(Produits,Pourcentages,colors)


plot_ly(Data, labels = ~Produits, values = ~Pourcentages, type = 'pie', marker = list(colors = ~colors))%>%
  layout(title = 'Les pourcentages des types de soins préférés',
         xaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE),
         yaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE),
         showlegend = TRUE)

我遇到此错误:

class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
        int m = matrix.length;
        int n = matrix[0].length;
        int i,j;
        for(i = 0; i < m; i++)
        {
            if(target >= matrix[i][0] && target <= matrix[i][n-1])
            {
              break;  
            }
        }

       for(j = 0; j < n; j++)
       {
           if(matrix[i][j] == target)
           {
               return true;
           }
       }

        return false;
    }

}     

2 个答案:

答案 0 :(得分:0)

您的代码没有考虑以下两种情况:

  1. 传递的数组为。在这种情况下,数组没有索引0,并且访问matrix[0].length失败。这就是为什么您会得到例外。
  2. 传递的数组不包含。在这种情况下,第二个循环将抛出IndexOutOfBoundsException,因为i == mmatrix[i][j] == target超出了范围。

您可以轻松地修复它们:

public static boolean searchMatrix(int[][] matrix, int target) {
    // Matrix empty, can not find element
    if (matrix.length == 0 || matrix[0].length == 0) {
        return false;
    }

    int m = matrix.length;
    int n = matrix[0].length;

    // Search row
    int targetRow = -1;
    for (int i = 0; i < m; i++) {
        if (target >= matrix[i][0] && target <= matrix[i][n - 1]) {
          targetRow = i;
          break;
        }
    }

   // No row found
   if (targetRow == -1) {
       return false;
   }

   for (int j = 0; j < n; j++) {
       // Target found
       if (matrix[targetRow][j] == target) {
           return true;
       }
   }

   // Target not inside row
   return false;
}

请注意,由于行也进行了排序,因此您可以使用二进制搜索进一步改善搜索范围。您甚至可以隐式地展平整个数组(将所有行展平为一行),然后在所有元素上展开二进制搜索。这将比您的方法更快。

答案 1 :(得分:0)

正如Zabuza指出的那样,您的代码中存在多个错误。

正如rghome指出的那样,您可能不正确地初始化了矩阵。

尝试用这种方式初始化矩阵。然后您的代码将起作用(下面的示例按预期返回true):

    int[][] matrix = {{1, 3, 5, 7}, {10, 11, 16, 20}, {23, 30, 34, 50}};
    System.out.println(new Solution().searchMatrix(matrix, 3));

然后通过Zabuza的答案来解决您的错误。