练题100天——DAY21

今天写了两道题,难度,并更新了之前的DAY13的冒泡排序+二进制求和、DAY14全排列的思路

一.在区间范围内统计奇数个数 ★☆☆☆☆

题目

力扣1523. 在区间范围内统计奇数数目 :给你两个非负整数 lowhigh 。请你返回lowhigh之间(包括二者)奇数的数目。

思路

直接利用循环,遍历从low到high之间的数字,统计奇数的个数.

注意:这种做法有超时的风险。

代码
cpp 复制代码
class Solution {
public:
    int countOdds(int low, int high) {
        int count=0;
        for(int i=low;i<=high;i++){
            if(i%2!=0){
                count++;
            }
        }
        return count;
    }
};
时间复杂度

O(n):n表示区间长度high-low+1

官方题解

思路

利用前缀和的思路,用pre(x)表示0~x的奇数个数,则pre(x)=⌊(x+1)/2⌋(向下取整)。因为数字都是就排列的,0~x一共 x+1 个数,那么奇数和偶数"各占一半",同时x为偶数时,总体的偶数比奇数多一个。所以这道题可以直接用 pre(high)-pre(low-1)得出结果。

注意:因为题目中要求包含low和high,所以是pre(high)-pre(low-1),如果用pre(high)-pre(low)会导致漏掉low本身

代码

我直接返回的表达式,官方将pre写成了一个函数

cpp 复制代码
class Solution {
public:
    int countOdds(int low, int high) {
        return ((high+1)/2)-((low)/2);
    }
};
时间复杂度

O(1):与输入规模无关的常规操作

二.合并两个有序数组 ★★★☆☆

题目

88. 合并两个有序数组 给你两个按 非递减顺序 排列的整数数组 nums1nums2,另有两个整数 mn ,分别表示 nums1nums2 中的元素数目。

请你 合并 nums2nums1 中,使合并后的数组同样按 非递减顺序 排列。

注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n

思路

先将nums1的元素保存到新数组nums中,然后比较nums和nums2的元素,大的放入nums1,同时对应的索引要移动。最后按照题目要求格式打印nums1即可。

代码
cpp 复制代码
class Solution {
public:
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
        //双指针
        //较小的值放入nums1
        //先将nums的元素保存到另一个数组中
        vector<int> nums(m);
        for(int i=0;i<m;i++){
            nums[i]=nums1[i];
        }
        int i=0,j=0,index=0;
        while(i<m && j<n){
            if(nums[i]>nums2[j]){
                nums1[index++]=nums2[j++];
            }else{
                nums1[index++]=nums[i++];
            }
        }
        //循环结束可能只有一个数组的元素被全部保存
        if(index!=m+n){
            while(i<m){
                nums1[index++]=nums[i++];
            }
            while(j<n){
                nums1[index++]=nums2[j++];
            }
        }

        printf("[");
        for(i=0;i<m+n;i++){
            if(i==m+n-1){
                printf("%d",nums1[i]);
            }else{
                printf("%d,",nums1[i]);
            }
        }
        printf("]");
    }
};
时间复杂度

O(m+n)

说明:还要其他解法,我明天再写

相关推荐
计科杨某人4 分钟前
简单算法题(基础入门题)
c++·算法·题解·入门·基础算法
Q一件事12 分钟前
RWEQ计算——Wf因子
算法
zander25814 分钟前
LeetCode 64. 最小路径和
算法·深度优先
find1star9 小时前
LeetCode 141:环形链表
java·算法·leetcode·链表
迅翼SwiftWing9 小时前
编队系列(总)|固定翼编队如何实现稳定飞行?通信架构、协同算法与工程约束深度解析
算法·架构
LB21129 小时前
力扣160 21 86
算法·leetcode·职场和发展
小智老师PMP10 小时前
2026深度解析|PMP第八版与NPDP核心侧重点本质区别(管理类证书怎么选)
开发语言·分布式·算法·职场和发展·产品经理
HugoStudio_SWAN10 小时前
洛谷 B4450 / B3867 / B3923 智慧购物、储蓄与做题——从程序到生活
c++·学习·程序人生·算法·生活
a1879272183110 小时前
【算法】动态规划第二篇:双序列 DP 三课——继承、计步与断链
算法·leetcode·动态规划·dp·回溯·暴力·算法讲解
江畔柳前堤11 小时前
前台·中台·后台:2026年AI原生时代的架构全景图
开发语言·人工智能·算法·机器学习·架构·scala·ai-native