题目详情

一个长度为 n 的整形数组nums,其中 n > 1,返回一个数组 output ,其中 output[i] 等于nums中除nums[i]以外所有元素的乘积。

不用除法 且在O(n)内解决这个问题。

Example:

Input: [1,2,3,4]

Output: [24,12,8,6]

思路

  • 比较好的解决方法是构造两个数组相乘:

1.[1, a1, a1 a2, a1 a2 * a3]

2.[a2 a3 a4, a3 * a4, a4, 1]

具体代码

  1. /**
  2. * @param {number[]} nums
  3. * @return {number[]}
  4. */
  5. var productExceptSelf = function(nums) {
  6. let len = nums.length
  7. let arr = []
  8. let p
  9. arr[0] = p = 1
  10. for(let i = 1; i < len; i++) {
  11. p *= nums[i-1]
  12. arr[i] = p
  13. }
  14. p = 1
  15. for(let i = len - 2; i >=0; i--) {
  16. arr[i] *= p*= nums[i+1]
  17. }
  18. return arr
  19. };

Array - 565. Array Nesting(数组嵌套)

题目详情

索引从0开始长度为N的数组A,包含0到N - 1的所有整数。找到并返回最大的集合S,S[i] = {A[i], A[A[i]], A[A[A[i]]], … }且遵守以下的规则。

假设选择索引为i的元素A[i]为S的第一个元素,S的下一个元素应该是A[A[i]],之后是A[A[A[i]]]… 以此类推,不断添加直到S出现重复的元素。

Example:

Input: A = [5,4,0,3,1,6,2]

Output: 4

Explanation:

A[0] = 5, A[1] = 4, A[2] = 0, A[3] = 3, A[4] = 1, A[5] = 6, A[6] = 2.

其中一种最长的 S[K]:
S[0] = {A[0], A[5], A[6], A[2]} = {5, 6, 2, 0}

思路

  • 按照题意思路去写

具体代码

/**
 * @param {number[]} nums
 * @return {number}
 */ 
var arrayNesting = function(nums) {
    let maxLen = 0
    for(let i = 0, len = nums.length; i < len; i++) {
        let curLen = 1,
            val = nums[i]
        while(Math.abs(val)!=i) {
            val = nums[Math.abs(val)]
            curLen++
        }
        maxLen = Math.max(curLen, maxLen)
    }
    return maxLen
};