携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第5天,点击查看活动详情
前言
有人相爱,有人夜里开车看海,有人LeetCode第一题都做不出来😁😁
算法题不一定很抽象,也不一定很难。今天就盘点一下,力扣那些适合新手的入门题
1.二分查找(704)
给定一个升序数组和待查找元素,返回元素在数组的位置没有返回-1。
思路:通过中间元素跟待查找元素比大小,根据:mid = left + Math.floor((right - left) / 2) 来决定下次查找中间键往哪靠,最左边最右边怎么变。大了:中间键就得往左,因为left不变,整体值变小,所以right 要变小,反之同理。
var search = function(nums, target) {
let left=0;
let right =nums.length -1;
while(left <= right){
let mid = left + Math.floor((right - left) / 2);
const num=nums[mid];
if(nums[mid] == target){
return mid;
}else if(num < target){
left = mid + 1;
}else{
right = mid - 1;
}
}
return -1;
};
2.第一个错误版本(208)
二分查找的异化,也是一串有序数组,第N个数及后面通过isBadVersion()为true,其余false,找到这个N。
思路:上面是对比大小,这里是对比布尔值,为真就说明超过那个N了,这里就更新右边边界,为假就说明还没到,更新左边边界,不断缩小区间。我想过如果中间值恰巧是N,这里也不能直接返回right值结束,因为这样会增加判断次数由此增加执行时间。
var solution = function(isBadVersion) {
return function(n) {
let left =1;
let right =n;
while(left < right ){
const mid =left+ Math.floor((right-left)/2);
if(isBadVersion(mid)){
right =mid;
}else{
left =mid+1;
}
}
return left;
};
};
3.搜索插入位置(35)
例子:
输入: nums = [1,3,5,6], target = 5 输出: 2
输入: nums = [1,3,5,6], target = 7 输出: 4
模版小改,整体思路差不多
var searchInsert = function(nums, target) {
const n = nums.length;
let left = 0, right = n - 1, ans = n;
while (left <= right) {
let mid = ((right - left) >> 1) + left;
if ( nums[mid] >= target ) {
ans = mid;
right = mid - 1;
} else {
left = mid + 1;
}
}
return ans;
};
4.有序数组的平方(977)
这题就很直观了,思路直接就是平方之后在排序,下面这种是最简单直观的。
var sortedSquares = function(nums) {
var arr = []
for(var i= 0;i < nums.length;i++){
arr.push(Math.pow(nums[i],2))
}
arr.sort((a,b) =>{
return a-b;
})
return arr;
};
或者利用双指针排序,因为题目说了是非递减顺序数组(就是按自然数序列排布),这说明最大值要么是最左边要么是最右边,所以在最开始判断哪边值最大,就可以 以此写入。
var sortedSquares = function(nums) {
let left = 0;
let right = nums.length - 1;
let result = [];
let write = nums.length - 1;
while (left <= right){
if (Math.pow(nums[left],2) > Math.pow(nums[right],2)){
result[write] = Math.pow(nums[left],2);
left ++;
write --;
}
else {
result[write] = Math.pow(nums[right],2);
right --;
write --;
}
}
return result;
};
5.旋转数组(189)
将数组整体向右移N个数,输出移动后的数组。
这里考点就是怎么处理N位后元素,超过数组边界的从头开始计算,这里我想到了取余方式安置元素,将整个数组进行重新绘制后输出。
var rotate = function(nums, k) {
const n = nums.length;
const newArr = new Array(n);
for (let i = 0; i < n; ++i) {
newArr[(i + k) % n] = nums[i];
}
for (let i = 0; i < n; ++i) {
nums[i] = newArr[i];
}
return nums;
};
后续会持续更新算法题中的那些软柿子🥰🥰