算法:下一个更大元素I(来自leetcode)

时间:2017-04-26 20:31:43

标签: javascript arrays algorithm

有人可以告诉我在解决这个算法时我缺少什么吗?我遇到的一个问题是我在嵌套循环中的第一个if语句没有评估,但我不知道为什么它不会评估。

以下是问题的描述:

您将获得两个数组(不重复)nums1和nums2,其中nums1的元素是nums2的子集。在nums2的相应位置找到nums1' s元素的所有下一个更大的数字。 nums1中的数字x的下一个更大数字是nums2中右边第一个更大的数字。如果它不存在,则输出该数字的-1。

示例1:

输入:nums1 = [4,1,2],nums2 = [1,3,4,2]。

输出:[ - 1,3,-1]

说明:     对于第一个数组中的数字4,在第二个数组中找不到下一个更大的数字,因此输出-1。     对于第一个数组中的数字1,第二个数组中的下一个更大数字是3。     对于第一个数组中的数字2,第二个数组中没有下一个更大的数字,因此输出-1。

link to original description

到目前为止,这是我的代码:

 var nums1 = [4,1,2];
 var nums2 = [1,3,4,2];

  var nextGreaterElement = function(findNums, nums) {
    var holder = [];

    for (var i = 0; i < findNums.length; i++) {

     //loop through the 2nd array starting at the index of the first loop's current item. 

      for (var j = nums.indexOf(findNums[i]); i < nums.length - j; i++) {

        if (nums[j+1] > nums[j]) {
          holder.push(nums[j+1]);
          break;
        } 

        if (nums[nums.length]) {
          holder.push(-1);
        }
      }
    }
    return holder;
};

nextGreaterElement(nums1, nums2)

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

问题:在内循环(j-loop)中更新变体i,但不更新变体j

缺失:调试工作量

问题说明

理论上,您的代码设计应将 nums1 中的每个值与 nums2 的相关部分进行比较。因此,对于外部for循环的每次迭代,它将转向外部for循环以循环 nums1 和内部for循环以循环 nums2 的相关部分

在你的代码中,variant i是findNums的索引指针(即 nums1 ),而variant j是nums的索引指针(即 nums2 )。变量i总是在内部for循环和外部for循环中更新,而变量j在外部for循环的每次迭代中都设置一次。这与你想要做的事情相矛盾。

调试(您的遗失工作)

找一张纸和一支笔。坐下来,干运行程序并保持记录相关信息(变种i,变种j,findNums [i],nums [j],...),你可以找出你的代码无法正常工作的原因。

可能的解决方案

var nextGreaterElement = function(findNums, nums) {
    var holder = [];

    for (var i = 0; i < findNums.length; i++) {
      var hasNextGreaterElement = false;
      // try to serach for next greater element
      for (var j = nums.indexOf(findNums[i])+1; j < nums.length; j++) {
        // handle case for next greater element is found
        if (nums[j] > findNums[i]) {
          holder.push(nums[j]);
          hasNextGreaterElement = true;
          break;
        }
      }
      // handle case for next greater element is not found
      if (!hasNextGreaterElement) {
          holder.push(-1);
      }
    }
    return holder;
};

var findNums=[4,1,2];
var nums=[1,3,4,2];
console.log(nextGreaterElement(findNums, nums));

答案 1 :(得分:0)

您需要对正在查找的阵列进行排序,以便更容易找到该号码。如果数组变大,您可能希望搜索算法更快地找到数组中的索引。对于要进行排序的数组,您可以将下一个数字作为一个更大的数字,并检查您是否位于数组的末尾。如果您不这样做,请检查当您找不到该号码或没有更大号码时该功能会出错。最后你的第二个if语句没有意义。所以我检查以确保在输出数组中的-1之前我们位于数组的末尾。

    var nextGreaterElement = function(findNums, nums) {
    var holder = [];
    //Should sort the array to make sure you get the next largest number
    nums = nums.sort();
    for (var i = 0; i < findNums.length; i++) {

     //loop through the 2nd array starting at the index of the first loop's current item. 

      //for (var j = nums.indexOf(findNums[i]); i < nums.length - j; i++) {
        for(var j = 0; j < nums.length; j++){
          //check for value in array and make sure the value is not at the end
          if (findNums[i] == nums[j] && j != nums.length - 1) {
            holder.push(nums[j+1]);
            break;
          } 
        //check for the last element in array if so output -1
        if (j == nums.length - 1) {
          holder.push(-1);
        }
      }
    }
    return holder;
};