Array 数组

1. 是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。所以JS中的Array不是真正意义上的数组,实际上是散列表存储。

2. CPU缓存也有优势,CPU时间是一次读取当前内存,往后多一点的内容,避免频繁与内存交互,效率更高。

3. 为何索引是从0开始的? a. 历史原因,c语言是从0开始定义;b. 这里的索引其实是偏移量,第一个位置是不需要偏移,所以为0,减少一次cpu计算偏移量。比如第二个元素,偏移量就是索引1, 而不需要多一次计算(2-1)或者(n-1)次。

4. c语言没有数组越界的概念,js也是。高级语言java,c#有。

5. 高级语言一般有动态扩容的数组,ArrayList,这个对象使用起来很方便,但是空间利用率不高,同时存储起来也更费空间。

LeetCode力扣 相关题目

1. 2/3数之和等于某个值,下面例子只有一组答案。3个数求解类似的。

暴力求解 O(n^2)
var
twoSum = function (nums, target) { for (let i = 0; i < nums.length - 1; i++) { for (let j = i + 1; j < nums.length; j++) { if (nums[i] + nums[j] === target) { return [nums[i], nums[j]]; } } } };
//用散列表结构记录下,时间复杂度优化为O(n),我们假定只有一组数据满足。
var twoSum = function(nums, target) { let res = {} for (let i = 0; i < nums.length; i++) { // 每个人报出自己想要配对的人 if (res[nums[i]] !== undefined) { // 如果有人被登记过 return [nums[i], res[nums[i]]] // 就是他 } else { res[target - nums[i]] = nums[i] // 主持人记住他的需求 } } }
3个数求和为 0
var threeSum = function(nums) { let res = [] let hash = {} for (let i = 0; i < nums.length - 2; i++) { // 每个人 for (let j = i + 1; j < nums.length - 1; j++) { // 依次拉上其他每个人 if (hash[nums[j]] !== undefined) { // 已经有合适自己的两人组 res.push([nums[j]].concat(hash[nums[j]])) hash[nums[j]] = undefined } else { // 没有合适自己的两人组 let mark = 0 - nums[i] - nums[j] hash[mark] = [nums[i], nums[j]] } } } return res }

2. 求众数

 https://leetcode-cn.com/problems/majority-element/

a. 排序后,中间索引那个数一定是众数。

b. hash记录数据个数,超过n/2 也就是他了。

3.求缺失的最小正整数

https://leetcode-cn.com/problems/first-missing-positive/

var firstMissingPositive = function(nums) {
    if(nums.length === 0){
        return 1;
    }

    let mySet = new Set();
    for(let i =0; i < nums.length; i++){
        if(nums[i] > 0){
            mySet.add(nums[i])
        }
    }

    let i =1;
    for(;i <= nums.length; i ++){
        if(!mySet.has(i)){
            return i;
        }
    }

     return i;

};
原文地址:https://www.cnblogs.com/roy1/p/13530201.html