js数组复习
zhuanlan.zhihu.com/p/371236424
在JS中,数组存在两种形式,一种是与C语言类似的,一组连续的内存空间;另一种是基于HashTable的慢数组。
704. 二分查找
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1
二分思路(初见):
思路一、暴力,for循环找到对应的target
function binarySearch(nums,target){
let length = nums.length
for(let i = 0;i<length;i++){
if(target === nums[i]){
return i
}
}
return -1
}
时间复杂度:O(n)
思路二、二分
function binarySearch(nums,target){
let left = 0
let right = nums.length -1 //nums.length
while(left <= right){ // <
let mid = left + Math.floor((right-left)/2) // 取中值常见操作
if(target === nums[mid]){
return mid
}
if(target<nums[mid]){
right = mid -1 //mid
}
if(target>nums[mid]){
left = mid+1
}
}
return -1
}
时间复杂度:O(logn)
27. 移除元素
思路一:for 循环 错误
function removeElement(nums,val){
for(let i =0 ; i<nums.length;i++){
if(nums[i] === val){
nums.splice(i,1) // 踩坑,修改原数组后遍历出问题
}
}
return nums.length
}
这里简单复习一下修改数组的JS操作 juejin.cn/post/684490…
思路二:双指针
function removeElement(nums,val){
let slow = 0
for(let i =0 ; i<nums.length;i++){ //i=fast
if(nums[i]!=val){
nums[slow++] = nums[i]
}
}
return slow
}
时间复杂度:O(n)
思路三:双指针 leetcode 优化 相当于把等于val的部分都放到右边去,相遇时则放完
function removeElement(nums,val){
let left = 0, right = nums.length;
while (left < right) {
if (nums[left] === val) {
nums[left] = nums[right - 1];
right--;
} else {
left++;
}
}
return left;
}
时间复杂度:O(n)