初级算法-array

2021/09/11

删除排序数组中的重复项

给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

const removeDuplicates = function (nums) {
  for (let i = 0; i < nums.length; i++) {
    while (nums[i] === nums[i + 1]) {
      nums.splice(i + 1, 1);
    }
  }
};

买卖股票的最佳时机

给定一个数组 prices ,其中 prices[i] 是一支给定股票第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。 注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)

const maxProfit = function (prices) {
  let ans = 0;
  for (let i = 1, len = prices.length; i < len; i++) {
    ans += Math.max(0, prices[i] - prices[i - 1]);
  }
  return ans;
};

旋转数组

给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。

const rotate = function (nums, k) {
  const afnum = nums.splice(nums.length - k % nums.length);
  nums.splice(0, 0, ...afnum);
};

存在重复元素

给定一个整数数组,判断是否存在重复元素。如果存在一值在数组中出现至少两次,函数返回 true 。如果数组中每个元素都不相同,则返回 false 。

const containsDuplicate = function (nums) {
  return nums.length !== Array.from(new Set(nums)).length;
};

只出现一次的数字

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

const singleNumber = function (nums) {
  return nums.reduce((pre, cur) => {
    return pre ^ cur;
  });
};

两个数组的交集 II

给定两个数组,编写一个函数来计算它们的交集。

const intersect = function(nums1, nums2) {
    const sn1 = nums1.sort((a, b) => a-b);
    const sn2 = nums2.sort((a, b) => a-b);
    let index1 = 0;
    let index2 = 0;

    const result = [];
    while (index1 < sn1.length && index2 < sn2.length) {
      const n1 = sn1[index1]
      const n2 = sn2[index2]
      if(n1 === n2) {
        result.push(n1);
        index1 ++
        index2 ++
        continue
      }
      n1 < n2 ? index1 ++ : index2++;
    }
    return result;
};

加一

给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。 最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。 你可以假设除了整数 0 之外,这个整数不会以零开头。

const plusOne = function(digits) {
  let len = digits.length;
  let index = len-1;
  digits[index] +=1;

  while (digits[index] > 9) {
    digits[index] = 0;
    --index;
    if( index < 0) {
      digits.unshift(1);
    } else {
      digits[index] +=1;
    }
  }

  return digits;
};

通过 Bigint 实现

function plusOne(digits) {
  return Array.from(new Bi)
}

移动零

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

const moveZeroes = function (nums) {
  let end = nums.length
  for (let index = 0; index < end;) {
    if (nums[index] === 0) {
      nums.splice(index, 1)
      nums.push(0)
      end--;
    }
  else {
      index++;
    }
  }
}

两数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。 你可以按任意顺序返回答案。

function twoSum(nums, target) {
  const len = nums.length;
  for (let index = 0; index < len; index++) {
    for (let index2 = index + 1; index2 < len; index2++) {
      if(nums[index] + nums[index2] === target) {
        return [index, index2]
      }
    }
  }
}
// Map 的取值、插入和查找的时间复杂度是 O(1)
function twoSum(nums, target) {
  const len = nums.length;
  const map = new  Map();
  for (let index = 0; index < len; index++) {
    if(map.has(target - nums[index])) {
      return [map.get(target - nums[index]), index]
    }
    map.set(nums[index], index);
  }
}

有效的数独

请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)

排序

https://www.runoob.com/w3cnote/bubble-sort.html

Edit this page on GitHub