代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素、977.有序数组的平方。
704.二分查找
总结:
防止int溢出:
//C++
class Solution {
public:
int search(vector<int>& nums, int target) {
int left=0;
int right=nums.size()-1;
while(left<=right){
int middle=(left+right)/2;//int mid = (right - left) / 2 + left;
if(target<nums[middle]){
right=middle-1;
}
else if(target>nums[middle]){
left=middle+1;
}
else return middle;
}
return -1;
}
};
(right - left) / 2 + left
是一种常见的技巧,确保计算数组中间索引时不会因为加法导致整数溢出,特别是在处理非常大的数组边界时非常有用。
//js
var search = function(nums, target) {
let left=0;
let right=nums.length-1;
while(left<=right){
let middle=Math.floor((right-left)/2+left);
if(target<nums[middle]){
right=middle-1;
}
else if(target>nums[middle]){
left=middle+1;
}
else return middle;
}
return -1;
};
注意Math
函数首字母大写,Math.floor()
向下取整
注意length
是数组的一个属性,切勿写成length(),不存在此函数
//python
class Solution(object):
def search(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
left,right=0,len(nums)-1
while left<=right:
middle=left+(right-left)//2
if target<nums[middle]:
right=middle-1
elif target>nums[middle]:
left=middle+1
else:
return middle
return -1
注意python中除以是//
,且else if实际上为elif
27.移除元素
总结:使用快慢指针
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int fast=0,slow=0;
for(fast;fast<nums.size();fast++){
if(nums[fast]!=val){
nums[slow]=nums[fast];
slow++;
}
}
return slow;
}
};
使用快慢指针,快指针获得当下不等于val的值,并将其值赋给慢指针。
977.有序数组的平方
总结:使用双向指针
//C++
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int j=nums.size()-1;
int k=nums.size()-1;
vector<int> newQ(nums.size());
for(int i=0;i<=j;){
if(nums[i]*nums[i]>nums[j]*nums[j]){
newQ[k--]=nums[i]*nums[i];
i++;
}
else{
newQ[k--]=nums[j]*nums[j];
j--;
}
}
return newQ;
}
};
注意vector记得初始化,否则为0;
class Solution(object):
def sortedSquares(self, nums):
"""
:type nums: List[int]
:rtype: List[int]
"""
i,j=0,len(nums)-1
k=len(nums)-1
res = [float('inf')] * len(nums) # 需要提前定义列表,存放结果
#这个表达式创建了一个新的列表,列表的元素是 float('inf'),数量等于 len(nums)。
while i<=j:
if nums[i]*nums[i]>nums[j]*nums[j]:
res[k]=nums[i]*nums[i]
k=k-1
i=i+1
else:
res[k]=nums[j]*nums[j]
k=k-1
j=j-1
return res
/**
* @param {number[]} nums
* @return {number[]}
*/
var sortedSquares = function(nums) {
let i=0;
let j=nums.length-1;
let k=nums.length-1;
let res = new Array(nums.length).fill(0);//记!怎么申明数组
for(i;i<=j;){
if(nums[i]*nums[i]>nums[j]*nums[j]){
res[k--]=nums[i]*nums[i];
i++;
}
else{
res[k--]=nums[j]*nums[j];
j--;
}
}
return res;
};
分类:
代码随想录算法训练营
标签:
leecode
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性