机试准备第一天

第一题:二分搜索法,题目不难,主要注意二分法的区间划分有两种情况:左闭右闭与左闭右开。

复制代码
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;
            if(nums[middle] > target)
                right = middle - 1;
            else if(nums[middle] < target)
                left = middle + 1;
            else return middle;
        }
        return -1;
    }
};

class Solution {
public:
#左闭右开
    int search(vector<int>& nums, int target) {
        int left = 0;
        int right = nums.size();
        while(left < right){
            int middle =  (left + right)/2;
            if(nums[middle] > target)
                right = middle;
            else if(nums[middle] < target)
                left = middle + 1;
            else return middle;
        }
        return -1;
    }
};

第二题是搜索插入位置,第一种解法是纯纯的暴力解,找到第一个大于等于target的数组下标。复杂度不满足要求,但是能通过。

复制代码
class Solution {
public:
    int searchInsert(vector<int>& nums, int target) {
        for(int i = 0; i < nums.size(); i++){
            if(nums[i] >= target) #找到第一个大于等于target的值下标
            return i;
        }
        return nums.size();
    }
};

第二种是利用二分法,若target在数组中,则直接返回下标,若不在数组中,则返回right+1。

复制代码
class Solution {
public:
    int searchInsert(vector<int>& nums, int target) {
        int left = 0;
        int right = nums.size() - 1;
        while(left <= right){
            int mid = (left+right)/2;
            if(nums[mid]>target)
            right = mid-1;
            else if (nums[mid]<target)
            left = mid + 1;
            else return mid;
        }
        return right + 1;
    }
};

第三题是在排序数组中查找元素的第一个和最后一个位置。利用二分法找到第一个和最后一个元素位置。

复制代码
class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {
        int first = -1;
        int last = -1;
        int left = 0;
        int right = nums.size() - 1;
        //寻找第一个左边界
        while(left <= right){//左闭右闭
        int mid = (left + right)/2;
        if(nums[mid] == target){
            first = mid;
            right = mid - 1;
        }
        else if(nums[mid] > target)
        right = mid - 1;
        else if(nums[mid] < target)
        left = mid + 1;
        }
        //寻找最后一个右边界
        int left1 = 0;
        int right1 = nums.size() - 1;
        while(left1 <= right1){
            int mid = (left1 + right1)/2;
            if(nums[mid] == target){
                last = mid;
                left1 = mid + 1;
            }
            else if(nums[mid] > target)
            right1 = mid - 1;
            else if(nums[mid] < target)
            left1 = mid + 1;
        }
        return {first, last};
    }
};

第四题是移除元素,先用暴力法试试水:

复制代码
class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int size = nums.size();
        for(int i = 0; i < size; i++){
            if(nums[i] == val){
                for(int j = i; j < size - 1; j++)
                nums[j] = nums[j+1];
                size--;
                i--;#防止有多个val时被跳过
            }
        }
        return size;
    }
};

方法二使用双指针法,fast指针指示新数组元素,slow指针指示新数组元素对应下标,每遍历到一个非val元素,更新一次slow。

复制代码
class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int slow = 0;
        for(int fast = 0; fast < nums.size(); fast++){
            if(nums[fast] != val){
                nums[slow] = nums[fast];
                slow++;
            }
        }
        return slow;
    }
};

第五题是有序数组的平方,可以先平方再排序。

复制代码
class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        for(int i=0; i < nums.size(); i++)
        nums[i] = nums[i]*nums[i];
        sort(nums.begin(), nums.end());
        return nums;
    }
};

第二种方法是双指针法,考虑到平方数的最大值一定位于数组的两侧,用i,j指示数组的两侧。

复制代码
class Solution {
public:
#双指针法
    vector<int> sortedSquares(vector<int>& nums) {
        int k = nums.size()-1;
        vector<int> result(nums.size(), 0);
        for(int i=0, j=nums.size()-1;i<=j;){
            if(nums[i]*nums[i] < nums[j]*nums[j]){
                result[k] = nums[j]*nums[j];
                k--;
                j--;
            }
            else{
                result[k] = nums[i]*nums[i];
                k--;
                i++;
            }
        }
        return result;
    }
};
相关推荐
xinyu_Jina7 小时前
Info Flow:去中心化数据流、跨协议标准化与信息源权重算法
算法·去中心化·区块链
Jac_kie_層樓7 小时前
力扣hot100刷题记录(12.2)
算法·leetcode·职场和发展
稚辉君.MCA_P8_Java7 小时前
Gemini永久会员 C++返回最长有效子串长度
开发语言·数据结构·c++·后端·算法
京东零售技术8 小时前
下一代 Lakehouse 智能未来新引擎 | Apache Hudi Meetup亚洲站活动回顾
算法
京东零售技术8 小时前
NeurIPS 2025 | TANDEM:基于双层优化的数据配比学习方法
后端·算法
zmzb01038 小时前
C++课后习题训练记录Day42
开发语言·c++·算法
CoovallyAIHub8 小时前
MAR-YOLOv9:革新农业检测,YOLOv9的“低调”逆袭
深度学习·算法·计算机视觉
Mr Lee_8 小时前
Smali 文件生成dex装箱算法整合
开发语言·python·算法
LDG_AGI8 小时前
【推荐系统】深度学习训练框架(十三):模型输入——《特征索引》与《特征向量》的边界
人工智能·pytorch·分布式·深度学习·算法·机器学习
CoovallyAIHub8 小时前
如何让SAM3在医学图像上比专用模型还强?一个轻量Adapter如何让它“秒变”专家?
深度学习·算法·计算机视觉