世界消息!2023-05-31:给定一个整数数组 A,你可以从某一起始索引出发,跳跃一定次数 在你跳跃的过程中,第 1、3、5... 次跳跃称为奇数跳跃 而第 2、4、6... 次跳跃称为偶数跳跃 你可以按以下
2023-05-31:给定一个整数数组 A,你可以从某一起始索引出发,跳跃一定次数
在你跳跃的过程中,第 1、3、5... 次跳跃称为奇数跳跃
(资料图片仅供参考)
而第 2、4、6... 次跳跃称为偶数跳跃
你可以按以下方式从索引 i 向后跳转到索引 j(其中 i < j):
在进行奇数跳跃时(如,第 1,3,5... 次跳跃),你将会跳到索引 j
使得 A[i] <= A[j],A[j] 是可能的最小值。如果存在多个这样的索引 j
你只能跳到满足要求的最小索引 j 上。
在进行偶数跳跃时(如,第 2,4,6... 次跳跃)
你将会跳到索引 j,使得 A[i] >= A[j],A[j] 是可能的最大值
如果存在多个这样的索引 j,你只能跳到满足要求的最小索引 j 上。
(对于某些索引 i,可能无法进行合乎要求的跳跃。)
如果从某一索引开始跳跃一定次数(可能是 0 次或多次)
就可以到达数组的末尾(索引 A.length - 1)
那么该索引就会被认为是好的起始索引。
返回好的起始索引的数量。
输入:[2,3,1,1,4]。
输出:3。
答案2023-05-31:
大体步骤如下:
1.对于数组中的每个元素,使用有序表(treemap)分别找到奇数规则和偶数规则下的下一步位置。
2.奇数规则下要寻找第一个大于等于当前值的位置,而偶数规则下要寻找第一个小于等于当前值的位置。
3.使用动态规划方法,从后往前遍历数组,对于每个位置分别判断是否能够到达数组的末尾。
4.定义 dp[i][0] 表示当来到 i 位置,且在奇数规则下,最终能否到达数组末尾。同理,dp[i][1] 表示当来到 i 位置,且在偶数规则下,最终能否到达数组末尾。
5.对于每个位置 i,如果奇数规则下可以跳到下一个位置 odd[i],则 dp[i][0] = dp[odd[i]][1]。同理,如果偶数规则下可以跳到下一个位置 even[i],则 dp[i][1] = dp[even[i]][0]。
6.初始化 dp[n-1][0] 和 dp[n-1][1] 为 true,表示从数组末尾出发,无论是奇数规则还是偶数规则,都可以到达该位置。
7.遍历数组,对于每个位置 i,如果 dp[i][0] = true,则说明从该位置出发遵循奇数规则可以到达数组末尾,答案加 1。
8.返回答案。
时间复杂度:在该算法中,使用了一次 treemap 的查询操作和一次 treemap 的插入操作,这两种操作的时间复杂度均为 O(log n),对于遍历整个数组以及动态规划的过程,其时间复杂度均为 O(n),因此总的时间复杂度为 O(n log n)。
空间复杂度:算法中使用三个数组以及一个有序表。其中 odd 和 even 数组的长度为 n,dp 数组的大小为 n * 2,而有序表需要存储 n 个元素,因此算法的空间复杂度为 O(n)。
go语言完整代码如下:
package mainimport ("fmt""github.com/emirpasic/gods/maps/treemap")func oddEvenJumps(arr []int) int {n := len(arr)// 来到了i位置,如果要遵循奇数规则,应该去哪?odd[i]odd := make([]int, n)// 来到了i位置,如果要遵循偶数规则,应该去哪?even[i]even := make([]int, n)// 有序表,// key : 某个值// value : key这个值,出现的最左位置// >= key 且最小// <= key 且最大orderMap := treemap.NewWithIntComparator()for i := n - 1; i >= 0; i-- {// i位置,arr[i],奇数规则,>= arr[i]且最小的!to, to2 := orderMap.Ceiling(arr[i])if to != nil {odd[i] = to2.(int)} else {odd[i] = -1}// i位置,arr[i],偶数规则,<= arr[i]且最大的!to, to2 = orderMap.Floor(arr[i])if to != nil {even[i] = to2.(int)} else {even[i] = -1}orderMap.Put(arr[i], i)}// dp[i][0] : 当来到i位置,且在奇数规则下,最终能不能到结尾?// dp[i][1] : 当来到i位置,且在偶数规则下,最终能不能到结尾?dp := make([][]bool, n)for i := range dp {dp[i] = make([]bool, 2)}dp[n-1][0] = truedp[n-1][1] = trueans := 1for i := n - 2; i >= 0; i-- {// dp[i][0] : 当来到i位置,且在奇数规则下,最终能不能到结尾// odd[i] -> 右走! -1if odd[i] != -1 {dp[i][0] = dp[odd[i]][1]}// dp[i][1] : 当来到i位置,且在偶数规则下,最终能不能到结尾if even[i] != -1 {dp[i][1] = dp[even[i]][0]}if dp[i][0] {ans++}}return ans}func main() {arr := []int{2, 3, 1, 1, 4}result := oddEvenJumps(arr)fmt.Println(result)}
rust语言完整代码如下:
use std::collections::BTreeMap;fn odd_even_jumps(arr: Vec) -> i32 { let n = arr.len(); // 来到了i位置,如果要遵循奇数规则,应该去哪?odd[i] let mut odd = vec![0; n]; // 来到了i位置,如果要遵循偶数规则,应该去哪?even[i] let mut even = vec![0; n]; // 有序表, // key : 某个值 // value : key这个值,出现的最左位置 // >= key 且最小 // <= key 且最大 let mut order_map = BTreeMap::new(); let mut i = n as i32 - 1; while i >= 0 { // i位置,arr[i],奇数规则,>= arr[i]且最小的! if let Some((&_to, &to2)) = order_map.range(arr[i as usize]..).next() { odd[i as usize] = to2; } else { odd[i as usize] = -1; } // i位置,arr[i],偶数规则,<= arr[i]且最大的! if let Some((&_to, &to2)) = order_map.range(..=arr[i as usize]).rev().next() { even[i as usize] = to2; } else { even[i as usize] = -1; } order_map.insert(arr[i as usize], i); i -= 1; } // dp[i][0] : 当来到i位置,且在奇数规则下,最终能不能到结尾? // dp[i][1] : 当来到i位置,且在偶数规则下,最终能不能到结尾? let mut dp = vec![vec![false; 2]; n]; dp[n - 1][0] = true; dp[n - 1][1] = true; let mut ans = 1; let mut i = n as i32 - 2; while i >= 0 { // dp[i][0] : 当来到i位置,且在奇数规则下,最终能不能到结尾 // odd[i] -> 右走! -1 dp[i as usize][0] = odd[i as usize] != -1 && dp[odd[i as usize] as usize][1]; // dp[i][1] : 当来到i位置,且在偶数规则下,最终能不能到结尾 dp[i as usize][1] = even[i as usize] != -1 && dp[even[i as usize] as usize][0]; ans += if dp[i as usize][0] { 1 } else { 0 }; i -= 1; } ans}fn main() { let arr = vec![2,3,1,1,4]; let result = odd_even_jumps(arr); println!("{}", result);}
c++完整代码如下:
#include #include #include
c语言完整代码如下:
#include #include #include struct BTreeNode { int key; int value; struct BTreeNode* left; struct BTreeNode* right;};struct BTreeMap { struct BTreeNode* root;};struct BTreeNode* createNode(int key, int value) { struct BTreeNode* node = (struct BTreeNode*)malloc(sizeof(struct BTreeNode)); node->key = key; node->value = value; node->left = NULL; node->right = NULL; return node;}struct BTreeNode* insertNode(struct BTreeNode* node, int key, int value) { if (node == NULL) { return createNode(key, value); } if (key < node->key) { node->left = insertNode(node->left, key, value); } else if (key > node->key) { node->right = insertNode(node->right, key, value); } else { node->value = value; } return node;}struct BTreeNode* findCeiling(struct BTreeNode* node, int target) { if (node == NULL) { return NULL; } if (node->key == target) { return node; } if (node->key < target) { return findCeiling(node->right, target); } struct BTreeNode* leftNode = findCeiling(node->left, target); if (leftNode != NULL) { return leftNode; } return node;}struct BTreeNode* findFloor(struct BTreeNode* node, int target) { if (node == NULL) { return NULL; } if (node->key == target) { return node; } if (node->key > target) { return findFloor(node->left, target); } struct BTreeNode* rightNode = findFloor(node->right, target); if (rightNode != NULL) { return rightNode; } return node;}struct BTreeMap* createMap() { struct BTreeMap* map = (struct BTreeMap*)malloc(sizeof(struct BTreeMap)); map->root = NULL; return map;}void insert(struct BTreeMap* map, int key, int value) { map->root = insertNode(map->root, key, value);}int getCeiling(struct BTreeMap* map, int target) { struct BTreeNode* ceilingNode = findCeiling(map->root, target); if (ceilingNode == NULL) { return -1; } return ceilingNode->value;}int getFloor(struct BTreeMap* map, int target) { struct BTreeNode* floorNode = findFloor(map->root, target); if (floorNode == NULL) { return -1; } return floorNode->value;}void destroyNode(struct BTreeNode* node) { if (node == NULL) { return; } destroyNode(node->left); destroyNode(node->right); free(node);}void destroyMap(struct BTreeMap* map) { destroyNode(map->root); free(map);}int oddEvenJumps(int* arr, int arrSize) { int n = arrSize; // 来到了i位置,如果要遵循奇数规则,应该去哪?odd[i] int* odd = (int*)malloc(n * sizeof(int)); // 来到了i位置,如果要遵循偶数规则,应该去哪?even[i] int* even = (int*)malloc(n * sizeof(int)); // 有序表, // key : 某个值 // value : key这个值,出现的最左位置 // >= key 且最小 // <= key 且最大 struct BTreeMap* orderMap = createMap(); for (int i = n - 1; i >= 0; --i) { // i位置,arr[i],奇数规则,>= arr[i]且最小的! int to2 = getCeiling(orderMap, arr[i]); if (to2 == -1) { odd[i] = -1; } else { odd[i] = to2; } // i位置,arr[i],偶数规则,<= arr[i]且最大的! to2 = getFloor(orderMap, arr[i]); if (to2 == -1) { even[i] = -1; } else { even[i] = to2; } insert(orderMap, arr[i], i); } destroyMap(orderMap); // dp[i][0] : 当来到i位置,且在奇数规则下,最终能不能到结尾? // dp[i][1] : 当来到i位置,且在偶数规则下,最终能不能到结尾? bool** dp = (bool**)malloc(n * sizeof(bool*)); for (int i = 0; i < n; ++i) { dp[i] = (bool*)malloc(2 * sizeof(bool)); dp[i][0] = false; dp[i][1] = false; } dp[n - 1][0] = true; dp[n - 1][1] = true; int ans = 1; for (int i = n - 2; i >= 0; --i) { // dp[i][0] : 当来到i位置,且在奇数规则下,最终能不能到结尾 // odd[i] -> 右走! -1 if (odd[i] != -1) { dp[i][0] = dp[odd[i]][1]; } // dp[i][1] : 当来到i位置,且在偶数规则下,最终能不能到结尾 if (even[i] != -1) { dp[i][1] = dp[even[i]][0]; } if (dp[i][0]) { ++ans; } } // 释放内存 for (int i = 0; i < n; ++i) { free(dp[i]); } free(dp); free(odd); free(even); return ans;}int main() { int arr[] = { 2,3,1,1,4 }; int arrSize = sizeof(arr) / sizeof(int); int result = oddEvenJumps(arr, arrSize); printf("%d\n", result); return 0;}
标签:
- 甘肃再续“艾黎情”:探职业教育德技并修
- 【城市守望者】致敬抗“疫”一线的“拆弹专家”
- 浙江绍兴越城区核酸检测结果公布 除1例阳性外其余均为阴性
- 内地首例奥密克戎变异株感染者身体状况如何?来自哪里?专家解读→
- 对变异病毒已有准备!关于中国新冠药物,钟南山发声→
- 江苏睢宁小网格大担当 织就乡村振兴“幸福网”
- 改造老旧小区 共享幸福生活
- 天津静海:群众在哪里,文明实践就延伸到哪里
- 齐齐哈尔:初步判断疫情感染来源为接触新冠病毒污染环境和物品
- 重庆大竹林派出所副所长因对群众态度简单粗暴被停职
- 黑龙江讷河病例感染源初步判断为新冠病毒污染的环境和物品
- 致敬2021
- 浙江瑞安民警捐献造血干细胞:14年前的心愿终将如愿
- “考研房”涨价离谱 律师:借机宰客有违市场伦理
- 广州白云机场:14天内有东莞旅居史的旅客须凭48小时核酸阴性证明乘机
- 浙江绍兴本轮疫情已报告确诊病例145例 无症状感染者1例
- 福建龙岩一男子和前妻斗气 扛着126斤硬币到法院“还钱”
- 重庆这座立交酷似“悟空” 走红 设计师揭秘(图)
- 青海警方破获特大电诈案 涉案流水高达1.7亿
- 云南新增境外输入确诊病例3例
- 黑龙江讷河市5名核酸阳性人员流调溯源:接触被新冠病毒污染的环境和物品
- 男子爱上女主播 假扮女主播闺蜜教其他男粉丝刷单
- 广西三市警方联手破获毒品案 全链条摧毁跨境贩毒团伙
- 广东东莞发现2例无症状感染者,部分镇今起全员筛查
- 从百二秦关到闻道凯旋 一个殉职医生最后的朋友圈
- 浙江发补充说明:三地铁路出行政策随风险等级同步调整
- 内蒙古新增本土确诊病例5例 均在呼伦贝尔满洲里市
- 陕西新增本土确诊病例1例 系隔离酒店工作人员
- 31省份新增新冠肺炎确诊病例76例 其中本土51例
- 浙江新增新冠肺炎确诊病例45例 其中本土44例
- 技能就是财富 技工也是人才
- 黑龙江新增本土确诊病例1例、本土无症状感染者4例
- 冷空气“调休”!我国大部陆续迎回暖 中东部雨雪稀少
- 华北黄淮等地大气扩散条件转差 冷空气将影响中东部
- 别误读了野猪或将不再是“三有”动物
- 您的ETC已到期?当心这个诈骗短信!
- 对回家的“宝贝”少一些关注,也是一种帮助
- 升温!北京今日阳光在线 最高气温将升至8℃
- 那年今日 | 一张漫画涨知识之12月14日
- 40岁男子一觉醒来突然听不见了 原因是……
- 本年度星空压轴大赏上演 双子座流星雨观赏地图来了
- 广东东莞大朗镇报告2例新冠肺炎无症状感染者
- 商丘4885份被盗出生证去哪了?10年“悬案”引关注
- 浙江海宁警方通报国家公祭日女子穿和服逛街
- 厨艺不精调料凑?懒人调料:年轻人的“下厨神器”
- “您的ETC已到期?”警方提醒:当心这个诈骗短信
- “网红”局长的热度 自述:走红后我就没有周末了
- 寻回被拐10年的儿子后又送走 儿子:害我没家了
- 小城里的三张面孔和警号301137
- 倡导“就地过年”,需因地制宜科学防疫
- 别用“入乡随俗”为星巴克找借口
- 北京地铁14号线年底全线贯通运营
- 天津市从入境人员中检出奥密克戎变异株
- “外滩活地图”黄俊:一个不想出圈的段子手交警
- 寻找一双儿女的25年
- 无锡市场监管部门责成星巴克涉事门店停业整改
- 海岛警事:为了一座岛和2900平方公里的海
- 北京民警宏福苑抗疫26天:“今夜我和雪花一起出发”
- 星巴克的“金标准”缘何败给了“潜规则”
- 患者被低价药“惊呆”的场面应该更多些
- 影视剧“超前点评”不止是“低级错误”
- “南昌鹦鹉案”下发不起诉决定书 网店上架费氏牡丹鹦鹉被拒
- 河南商丘4885份出生医学证明被盗始末追踪
- 绍兴市病例62-109活动轨迹公布
- 12月7日以来,杭州累计报告新冠肺炎确诊病例19例
- 浙江绍兴新增确诊病例37例 上虞区占36例
- 河南高院对张成功案作出死刑判决
- 四川一滑雪场停电游客被困索道 官方回应
- 浙江绍兴越城区新增1例新冠肺炎确诊病例 当地对防控区域划分进行调整
- 中国内地首次检出新冠病毒奥密克戎变异株
- 知网除了涉及著作权纠纷,是否涉嫌违反《反垄断法》?
- 浙江绍兴越城区新增1例新冠肺炎确诊病例
- 四川眉山千箱柑橘送往呼和浩特市抗疫一线
- 两名青年男女探险三亚落笔洞遗址被困沼泽 消防成功救援
- 中国地理学大会在福州发布《中国地理学界碳中和科技行动福州宣言》
- 天津从入境人员中检出新冠病毒奥密克戎变异株
- 江苏规定学科类校外培训机构一次性收费不超3个月
- 上海数字化转型提升教育质量 智慧教育助力“双减”
- 湖北荆门警方“团圆行动”助失散31年家庭团聚
- 成都大熊猫繁育研究基地大、小熊猫陆续搬入扩建区“新家”
- 隔离不隔爱 封控小区的内外“双向奔赴”
- 重庆摧毁为境外赌博网站提供资金支付结算特大犯罪团伙
- 追忆消防烈士张晓杰:逆火前行留忠魂
- 北京永定河以西地区高质量发展五年行动计划发布
- 打造北方“高颜值”大都市 沈阳再建2000个口袋公园
- 重庆抓获并对3516名跨境赌博犯罪嫌疑人采取强制措施
- 青海茫崖采油工人原创音乐作品获全国陶笛音乐作曲大赛二等奖
- 青海湖国家公园:推进流域生态保护 明确生态旅游发展空间
- 青海2020年水土保持成绩单:治理面积超2000平方公里
- 浙江金华依法查处多起涉疫违法案件 警方提醒民众不信谣
- “上头电子烟”竟涉毒 湖南首例涉新型毒品合成大麻素案告破
- 无视疫情防控要求 浙江舟山普陀一麻将房店主被拘9日
- 首批295个“司机之家”服务点上线地图应用
- “一场必须跑赢的战役” 沈阳民警争分夺秒跑赢骗子
- 湖北一自然保护区发现一批野生动物
- 扰乱核酸检测点秩序 男子被行政拘留8日
- 安徽“铁拳”查办4万余民生案件 案值1.27亿
- 贵阳警方推出利民户政新举措“三最”解民忧
- 内蒙古满洲里新增3例本土确诊病例 治愈出院32例
- 安徽大别山:林长制让绿水青山变幸福山
广告
广告
- 黑龙江讷河新增1例确诊4例无症状 病例详情公布
- 浙江宁波余姚奉化宁海三地开展核酸检测 结果均为阴性
- 浙江湖州南浔三处棋牌室经营者被行拘
- 那年今日 | 一张漫画涨知识之12月13日
- 在宁波乘火车跨省出行须持48小时内核酸阴性证明
- 浙江温州一地发现核酸弱阳性?复采复检结果均为阴性
- 浙江三门发现一名密接者:二次核酸检测结果均为阴性
- 贱卖的发电机 新买的制茶机——安徽水电供区改革两周年回访见闻
- 浙江杭州新增1例新冠肺炎确诊病例 为集中隔离人员
- 2022年研考在即,学硕缩招,专硕时代真的来了?
- 探访杭州核酸检测点:排队高峰多在夜间 医院24小时运转
- 浙江发挥零售药店“哨点”作用 织就疫情防控监测网
- 哈尔滨市本轮疫情首批1名确诊患者出院
- 宁波镇海第三轮全员核酸检测574181人 结果均为阴性
- 陕西新增本土确诊病例1例、境外输入无症状感染者2例
- 齐齐哈尔讷河一地调整为中风险地区
- 浙江新增新冠肺炎确诊病例75例 其中本土74例
- 内蒙古新增本土确诊病例5例 均在呼伦贝尔满洲里市
- 黑龙江无新增确诊病例 新增本土核酸检测初筛阳性人员5例
- 冷空气影响今起暂歇 雾和霾明后天“见缝插针”