小哆啦解题记:两数之和 II - 输入有序数组
小哆啦开始刷力扣的第二十二天
在算法的奇幻大陆上,小哆啦又开启了一段新的冒险。这天,智多星小智带着神秘笑容,蹦到小哆啦面前,像变戏法似的掏出一道题:“小哆啦,你瞧瞧这题,给你个数组 numbers,里面的数字就像乖乖排队的小朋友,按从小到大站得整整齐齐。现在要你从里面挑两个数,它们手拉手加起来正好等于目标数 target 。找到这俩数后,把它们在数组里的位置(从 1 开始算哦)写成 [index1, index2] 这样的小纸条给我。而且每个问题只有一个正确答案,每个数字只能用一次,空间嘛,只能用那么一丢丢哦。” 小哆啦一听,这不是在挑战它的智慧小宇宙嘛,立马摩拳擦掌,准备大干一场。
小哆啦的 “横冲直撞” 初尝试
小哆啦脑袋里灵光一闪,心想:“这有何难,一个一个挨着试不就好了!” 于是,它像个勤劳的小矿工,开始了代码挖掘:
function twoSum(numbers: number[], target: number): number[] {
for (let i = 0; i < numbers.length; i++) {
for (let j = i + 1; j < numbers.length; j++) {
if (numbers[i] + numbers[j] === target) {
return [i + 1, j + 1];
}
}
}
return [];
}
这段代码就像一个执着的探险家,外层循环带着第一个数,在数组的丛林里穿梭,内层循环则拉着后面的数,一个一个地问:“咱俩加起来能等于目标数不?” 要是找到了,就像发现宝藏一样,兴奋地把这俩数的位置写下来返回。要是找了个遍都没找到,就只能垂头丧气地交上一张空纸条(返回空数组)。
小智在一旁看得直撇嘴,像个小老师一样摇摇头说:“小哆啦,你这方法就像没头苍蝇乱撞,虽然精神可嘉,但效率嘛,实在不敢恭维。要是数组像大恐龙那么长,你这不得算到天荒地老?” 小哆啦听了,挠挠头,脸都红了。
小智妙计点拨,小哆啦 “华丽变身”
小智看小哆啦那可怜巴巴的样子,笑着拍拍它的肩膀说:“小哆啦,你得看看这数组的特殊之处呀,它是有序的,这可是解题的超级钥匙!” 小哆啦眼睛 “唰” 地一下亮了起来,就像被点亮的小灯泡。
小哆啦立马重新投入战斗,这次它的代码像穿上了超级战甲:
function twoSum(numbers: number[], target: number): number[] {
let left = 0;
let right = numbers.length - 1;
while (left < right) {
const sum = numbers[left] + numbers[right];
if (sum === target) {
return [left + 1, right + 1];
} else if (sum < target) {
left++;
} else {
right--;
}
}
return [];
}
这次,小哆啦派出了两个 “聪明小卫士”,一个站在数组的最左边(left),一个守在数组的最右边(right)。这俩小卫士把自己守护的数字加起来,要是和目标数对上了,就像对上了神秘暗号,立马兴高采烈地把位置汇报上去。要是加起来的和比目标数小,左边的小卫士就往右迈一步,让和变大点;要是和比目标数大,右边的小卫士就往左挪一步,让和变小点。就这样,两个小卫士像跳着神秘的舞蹈,一步步靠近,很快就能找到答案。
小智看着小哆啦的新代码,满意地竖起大拇指:“小哆啦,你这进步速度比火箭还快呀!这双指针法把数组有序的优势发挥得淋漓尽致,可比之前快多啦!” 小哆啦开心得手舞足蹈,它感觉自己在算法的世界里又强大了几分。
结语
在这场充满挑战与惊喜的算法之旅中,小哆啦从最初的懵懂试探,到借助有序数组特性实现华丽转身,成功解锁双指针法的奥秘。这不仅是解题方法的优化,更是小哆啦在算法智慧上的一次飞跃。
对于咱们广大算法探索者而言,小哆啦的经历就像一面镜子,时刻提醒我们,面对复杂难题时,不能局限于常规思维,要善于挖掘题目条件背后隐藏的 “宝藏”。每一个看似不起眼的信息,都有可能成为打开算法优化大门的钥匙。
愿我们都能像小哆啦一样,在算法的奇妙世界里勇敢闯荡,不断积累经验,收获知识与成长。相信在未来的算法之路上,无论遇到何种挑战,只要保持这份探索精神与敏锐洞察力,定能披荆斩棘,收获属于自己的辉煌成就!