代码随想录额外题目| 数组03 ●34排序数组查首尾位置 ●922按奇偶排序数组II●35搜索插入位置

这篇具有很好参考价值的文章主要介绍了代码随想录额外题目| 数组03 ●34排序数组查首尾位置 ●922按奇偶排序数组II●35搜索插入位置。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

#34排序数组查首尾位置

medium,我写的:1 暴力

vector<int> searchRange(vector<int>& nums, int target) {
        int start=-1;
        int end=-1;
        for(int i=0;i<nums.size();i++){
            if(nums[i]==target && start==-1) start=i;
            if(nums[i]==target && start>-1) end=i;
        }
        return {start,end};
    }

我写的,做了个类似二分搜索的方法:

vector<int> searchRange(vector<int>& nums, int target) {
        
        int start=0;
        int end=nums.size()-1;
        int res=-1;

        while(start<=end){
            //cout<<"start: "<<start<<", end: "<<end<<endl;
            int mid=(start+end)/2;
            
            if(nums[mid]==target){
                res=mid;
                break;
            }

            if(target<nums[mid]) end=mid-1;
            if(target>nums[mid]) start=mid+1;
        }
        //cout<<res<<endl;
        start=res; end=res;
        while(start>=0 && nums[start]==target){
            start--;
        }
        while(end<nums.size() && nums[end]==target){
            end++;
        }
        
        //if(nums.size()==1) return {0,0};
        if(res==-1) return{-1,-1};
        return {start+1,end-1};
    }

随想录:从两头都做类似二分搜索

代码随想录额外题目| 数组03 ●34排序数组查首尾位置 ●922按奇偶排序数组II●35搜索插入位置,代码随想录一刷,算法,数据结构,c++,leetcode

     vector<int> searchRange(vector<int>& nums, int target) {
        int leftBorder = getLeftBorder(nums, target);
        int rightBorder = getRightBorder(nums, target);
        // 情况一
        if (leftBorder == -2 || rightBorder == -2) return {-1, -1};
        // 情况三
        if (rightBorder - leftBorder > 1) return {leftBorder + 1, rightBorder - 1};
        // 情况二
        return {-1, -1};
    }
     int getRightBorder(vector<int>& nums, int target) {
        int left = 0;
        int right = nums.size() - 1;
        int rightBorder = -2; // 记录一下rightBorder没有被赋值的情况
        while (left <= right) {
            int middle = left + ((right - left) / 2);
            if (nums[middle] > target) {
                right = middle - 1;
            } else { // 寻找右边界,nums[middle] == target的时候更新left
                left = middle + 1;
                rightBorder = left;
            }
        }
        return rightBorder;
    }
    int getLeftBorder(vector<int>& nums, int target) {
        int left = 0;
        int right = nums.size() - 1;
        int leftBorder = -2; // 记录一下leftBorder没有被赋值的情况
        while (left <= right) {
            int middle = left + ((right - left) / 2);
            if (nums[middle] >= target) { // 寻找左边界
                right = middle - 1;
                leftBorder = right;
            } else {
                left = middle + 1;
            }
        }
        return leftBorder;
    }

#922 按奇偶排序数组II

我的解法,有点蠢:

代码随想录额外题目| 数组03 ●34排序数组查首尾位置 ●922按奇偶排序数组II●35搜索插入位置,代码随想录一刷,算法,数据结构,c++,leetcode

vector<int> sortArrayByParityII(vector<int>& nums) {
        int cnt=0;
        vector<int> odd;
        vector<int> even;
        for(int i=0;i<nums.size();i++){
            if(i%2!=0 && nums[i]%2==0) odd.push_back(i);

            if (i%2==0 && nums[i]%2!=0) even.push_back(i);
        }

        for(int i=0;i<odd.size();i++){
            swap(nums[odd[i]],nums[even[i]]);
        }

        return nums;
        
    }

inplace解法: 把odd idx放的偶数,给换到even idx放的奇数

注意j是从1开始,而且每轮i,j都是继续增加不回去

空间表现很好,但时间表现很一般

vector<int> sortArrayByParityII(vector<int>& nums) {
        int j=1;
        for(int i=0;i<nums.size();i+=2){
            if(nums[i]%2){
                while(j<nums.size() && nums[j]%2) j+=2;
                swap(nums[i],nums[j]);
            }
        }
        return nums;
    }

#35搜索插入位置 

要求复杂度O log n ,我写的:

int searchInsert(vector<int>& nums, int target) {
        int start=0;
        int end=nums.size()-1;
        while(start<=end){
            int mid=(start+end)/2;
            //cout<<"mid: "<<mid<<endl;
            if(nums[mid]==target) return mid;
            else if(mid==start) {
                if(start+1<nums.size() && target>nums[start+1]) return start+2;
                return target>nums[start]?start+1:start;
            }     
            if(nums[mid]>target) end=mid-1;
            if(nums[mid]<target) start=mid+1;
        }
        return -1;
    }

随想录写的:所有情况都能统一变成return end+1或者return start

int searchInsert(vector<int>& nums, int target) {
        int start=0;
        int end=nums.size()-1;
        int mid;
        while(start<=end){
            mid=(start+end)/2;
            if(nums[mid]==target) return mid;
               
            if(nums[mid]>target) end=mid-1;
            if(nums[mid]<target) start=mid+1;
        }
        return end+1;
    }

代码随想录额外题目| 数组03 ●34排序数组查首尾位置 ●922按奇偶排序数组II●35搜索插入位置,代码随想录一刷,算法,数据结构,c++,leetcode

这里没想明白为什么不对,有空想想文章来源地址https://www.toymoban.com/news/detail-609691.html

到了这里,关于代码随想录额外题目| 数组03 ●34排序数组查首尾位置 ●922按奇偶排序数组II●35搜索插入位置的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 代码随想录 - Day34 - 回溯:递增子序列+排列问题

    如果有相等的整数也算递增序列 递增子序列中 至少有两个元素 (遍历的时候不用遍历 nums 中最后一个元素) 题目说了数值范围,所以还可以用哈希表去重,速度比 set() 快很多。 但是,个人觉得没必要,因为放在实际情况中一般不会给数值范围。 全排列,即 [1,2] 和 [2,1] 算作

    2024年02月09日
    浏览(56)
  • 代码随想录 动态规划-基础题目

    目录 509.斐波那契数  70.爬楼梯 746.使用最小花费爬楼梯 62.不同路径 63.不同路径|| 343.整数拆分 96.不同的二叉树 509. 斐波那契数 简单 斐波那契数  (通常用  F(n)  表示)形成的序列称为  斐波那契数列  。该数列由  0  和  1  开始,后面的每一项数字都是前面两项数字的和

    2024年03月18日
    浏览(55)
  • 代码随想录第41天 | 动态规划part03

    ● 343. 整数拆分 ● 96.不同的二叉搜索树 题目一 343. 整数拆分 给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。 示例 : 输入: 10 输出: 36 解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。 说明: 你可以假设 n 不小于 2 且不大于 5

    2024年01月24日
    浏览(38)
  • 代码随想录 LeetCode数组篇 二分查找

    # (简单)704. 二分查找 题目链接 代码随想录 - 二分查找思路 二分查找,思路很简单,但是在while循环left和right的比较是写=还是,还有right=mid还是right=mid-1容易混淆 需要想清楚对区间的定义,是[left,right],还是[left,right) (版本一,左闭右闭版本) (版本二,左闭右开) 题目

    2024年02月02日
    浏览(32)
  • 【代码随想录 | Leetcode | 第四天】数组 | 螺旋矩阵 | 59

    欢迎来到小K的Leetcode|代码随想录|专题化专栏,今天将为大家带来螺旋矩阵的分享 ✨ 给你一个正整数 n ,生成一个包含 1 到 n 2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例 1: 示例 2: 提示: 思路: 本类型题目其实都不涉及什么算法,就是模拟

    2024年02月16日
    浏览(35)
  • 代码随想录【数组】----->有序数组的平方、长度最小的子数组、螺旋矩阵

    题目LeetCode977. 有序数组的平方 由于平方后 两边的元素最大,中间的元素最小 ,所以可以使用双指针。 定义left指向原数组最左边,right指向原数组最右边 比较left元素的平方和right元素的平方 left元素平方大于right元素平方,将left元素平方放在结果集最后,left++ right元素平方

    2023年04月27日
    浏览(41)
  • 【代码随想录 | Leetcode | 第四天】数组 | 螺旋矩阵 | 59-54

    欢迎来到小K的Leetcode|代码随想录|专题化专栏,今天将为大家带来螺旋矩阵的分享 ✨ 给你一个正整数 n ,生成一个包含 1 到 n 2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例 1: 示例 2: 提示: 思路: 本类型题目其实都不涉及什么算法,就是模拟

    2024年02月16日
    浏览(35)
  • 代码随想录Day1 | 数组01- leetcode 704、27

    题目链接:二分查找 关键问题:         - 边界(left、right)、当前查找值(middle)                 - target大于当前查找值 -- 当前查找区域的右边,更改区间left                 - target小于当前查找值 -- 当前查找区域的左边,更改区间right                 - middle的计

    2024年02月16日
    浏览(27)
  • 【C++代码】有序数组的平方,长度最小的子数组,螺旋矩阵 II--代码随想录

    题目:有序数组的平方 给你一个按 非递减顺序 排序的整数数组 nums ,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。 题解 数组其实是有序的, 只不过负数平方之后可能成为最大数了。那么数组平方的最大值就在数组的两端, 不是最左边就是最右边,不

    2024年02月11日
    浏览(33)
  • 【代码随想录-Leetcode第六题:209. 长度最小的子数组】

    给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。 参考【代码随想录】 示例 1: 示例 3: 提示: 1 = target = 109 1 = nums.length

    2024年02月12日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包