华为OD算法复习1——数组 Javascript
·
这些力扣题目来源:AI推荐+karshey博主
目录
704. 二分查找(通过)
1. 每一次查找都需要利用中间坐标 mid =Math.floor((start+end)/2)
2. 如果中间坐标的值大于查找目标,说明查找目标在左半部分:end=mid-1
3. 如果中间目标的值小于查找目标,说明查找目标在右半部分:start=mid+1
4. 找不到的话,返回-1
nums = [-1,0,3,5,9,12], target = 9
var search = function (nums, target) {
let start=0;
let end=nums.length-1;
while(start<=end){
let mid = Math.floor((start+end)/2);
if(nums[mid]==target) return mid;
if(nums[mid]>target){
end=mid-1;
} else {
start=mid+1;
}
}
return -1;
};
console.log(search(nums,target));
27.移除元素(通过)
splice方法会改变数组本身:此方法可以删除或者加入新的元素
nums = [0,1,2,2,3,0,4,2], val = 2
var removeElement = function(nums, val) {
let k=0;
let pointer = 0;
while(pointer<=nums.length-1){
if(nums[pointer]==val) {
nums.splice(pointer,1)
} else{
k++;
pointer++;
}
}
// console.log(nums);
return k;
};
console.log(removeElement(nums,val));
977.有序数组的平方(通过)
1. sort()分类方法 需要规定顺序,否则会按照字符串顺序返回
nums = [-4,-1,0,3,10]
var sortedSquares = function(nums) {
let ans=[];
for(let i=0;i<nums.length;i++){
ans.push(nums[i]**2)
}
ans.sort((a,b)=>a-b)
return ans;
};
console.log(sortedSquares(nums));
209. 长度最小的子数组(前缀和+滑动指针)(通过)
1. 使用前缀和可以快速求某一段数组的和 sum(n,m)=sum(0,m)-sum(0,n) +nums[n]
2. 因为全是正数:所以向右滑总和一定增加,向左滑总和一定减小
3. 滑动结束的条件:无法再向右滑增大:(start<nums.length&&end<nums.length)
4. 最后可以使用三元运算符判断 min==Infinity?0:min;
target = 7, nums = [2,3,1,2,4,3]
var minSubArrayLen = function(target, nums) {
let min=Infinity;
let start=0;
let end=0;
let sum_arr=[];
let sum=0
for(let i=0;i<nums.length;i++){
sum+=nums[i];
sum_arr.push(sum);
}
while(start<nums.length&&end<nums.length){
if(sum_arr[end]-sum_arr[start]+nums[start]>=target){
min=min<end-start+1?min:end-start+1;
start++;
} else {
end++;
}
}
return min==Infinity?0:min;
};
console.log(minSubArrayLen(target,nums));
303.区域和检索-数组不可变(前缀和)(通过)
/**
* @param {number[]} nums
*/
var NumArray = function(nums) {
this.nums=nums;
this.sum=[]
this.temp=0
for(let i=0;i<(this.nums).length;i++){
this.temp+=this.nums[i];
this.sum.push(this.temp);
}
};
/**
* @param {number} left
* @param {number} right
* @return {number}
*/
NumArray.prototype.sumRange = function(left, right) {
return this.sum[right]-this.sum[left]+this.nums[left];
};
/**
* Your NumArray object will be instantiated and called as such:
* var obj = new NumArray(nums)
* var param_1 = obj.sumRange(left,right)
*/
59.螺旋矩阵II(通过)
1. 创建二维数组,第一次需要fill(0)。否则后面的数组会被赋予相同的地址,一起改变值
2. 大循环结束的条件是数数小于平方
3. 数组的每个元素初始化都是0,代表这个位置还没有被走过。如果被走过或者越界,则结束小循环
4. 按照右,下,左,上的顺序依次走
/**
* @param {number} n
* @return {number[][]}
*/
var generateMatrix = function(n) {
let count=1;
let matrix = Array(n).fill(0).map(()=>Array(n).fill(0))
let i=0;
let j=-1;
while(count<=n*n){
while(j<n-1 && matrix[i][j+1]==0){
j++;
matrix[i][j]=count++;
}
while(i<n-1 && matrix[i+1][j]==0){
i++;
matrix[i][j]=count++;
}
while(j>0 && matrix[i][j-1]==0){
j--;
matrix[i][j]=count++;
}
while(i>0 && matrix[i-1][j]==0){
i--;
matrix[i][j]=count++;
}
}
return matrix;
};
console.log(generateMatrix(3));
更多推荐



所有评论(0)