代码随想录算法训练营第一天| 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;
};
posted @   W-Vicky11  阅读(662)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
点击右上角即可分享
微信分享提示