首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C-双指针数组-未获取正确的值

基础概念

C-双指针是一种常见的算法技巧,通常用于处理数组或链表中的问题。它通过使用两个指针来遍历数据结构,从而实现更高效的解决方案。双指针可以有不同的移动方式,例如一个指针向前移动,另一个指针向后移动,或者两个指针以不同的速度移动。

相关优势

  1. 时间复杂度优化:通过减少不必要的遍历,双指针算法通常可以将时间复杂度从O(n^2)降低到O(n)。
  2. 空间复杂度优化:双指针算法通常不需要额外的空间,因此空间复杂度较低。
  3. 适用性广泛:双指针算法适用于多种问题,如查找、排序、去重等。

类型

  1. 快慢指针:一个指针移动速度快,一个指针移动速度慢,常用于检测链表中的环。
  2. 左右指针:两个指针分别从数组的两端向中间移动,常用于查找满足特定条件的元素。
  3. 滑动窗口:两个指针形成一个窗口,窗口在数组上滑动,常用于解决连续子数组问题。

应用场景

  1. 查找数组中的重复元素:通过双指针可以快速找到数组中的重复元素。
  2. 查找链表中的环:快慢指针可以用来检测链表中是否存在环。
  3. 查找最接近目标值的三个数:通过左右指针可以找到数组中最接近目标值的三个数。

常见问题及解决方法

问题:未获取正确的值

原因

  1. 指针初始化错误:指针未正确初始化,导致从错误的位置开始遍历。
  2. 指针移动逻辑错误:指针移动的逻辑不正确,导致未能正确遍历所有需要的元素。
  3. 边界条件处理不当:未正确处理数组或链表的边界条件,导致越界或遗漏元素。

解决方法

  1. 正确初始化指针:确保指针从正确的位置开始遍历。
  2. 检查指针移动逻辑:仔细检查指针移动的逻辑,确保每个元素都被正确处理。
  3. 处理边界条件:确保在遍历过程中正确处理数组或链表的边界条件。

示例代码

以下是一个使用双指针查找数组中重复元素的示例代码:

代码语言:txt
复制
#include <stdio.h>

int findDuplicate(int* nums, int numsSize) {
    int slow = nums[0];
    int fast = nums[nums[0]];

    // 找到快慢指针的相遇点
    while (slow != fast) {
        slow = nums[slow];
        fast = nums[nums[fast]];
    }

    // 重置慢指针到起点
    slow = 0;
    while (slow != fast) {
        slow = nums[slow];
        fast = nums[fast];
    }

    return slow;
}

int main() {
    int nums[] = {1, 3, 4, 2, 2};
    int numsSize = sizeof(nums) / sizeof(nums[0]);
    int duplicate = findDuplicate(nums, numsSize);
    printf("Duplicate element is: %d\n", duplicate);
    return 0;
}

参考链接

LeetCode 287. 寻找重复数

通过以上方法,可以有效地解决双指针算法中未获取正确值的问题。确保指针初始化正确、移动逻辑正确以及边界条件处理得当是关键。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

获取缓存正确姿势

获取缓存正确姿势 cache 时至今日,大家对缓存想必不在陌生。我们身边各种系统中或多或少都存在缓存,自从有个缓存,我们可以减少很多计算压力,提高应用程序QPS。...不过,这样获取缓存逻辑,真的没有问题吗? ---- 高并发下暴露问题 你程序一直正常运行,直到某一日,运营同事急匆匆跑来找到你,你程序挂了,可能是XXX在大量抓你数据。...我们有什么更好方法获取缓存吗?当然有,这里通过guava cache来看下google是怎么处理获取缓存。...此时,guava cache通过刷新策略,直接返回旧缓存,并生成一个线程去处理loading,处理完成后更新缓存和过期时间。guava 称之为异步模式。...Long.valueOf(duration), unit}); this.refreshNanos = unit.toNanos(duration); return this; } ---- 总结 看似简单获取缓存业务逻辑没想到还暗藏玄机

1.8K80

有序数组平方 指针

给你一个按 非递减顺序 排序整数数组 nums,返回 每个数字平方 组成数组,要求也按 非递减顺序 排序。...2: 输入:nums = [-7,-3,2,3,11] 输出:[4,9,9,49,121] 指针数组其实是有序, 只不过负数平方之后可能成为最大数了。...那么数组平方最大就在数组两端,不是最左边就是最右边,不可能是中间。 此时可以考虑指针法了,i指向起始位置,j指向终止位置。...vector nums = {-4,-1,0,3,10}; // 存放结果数组 vector result(nums.size(), 0); // 用于存结果指针...// 遍历一次,首指针平方与尾指针平方比较 // 选择大,然后放在结果指针,然后结果指针-1 for (int i = 0, j = nums.size() - 1; i <= j

12220
  • 数组元素目标和(指针 or 二分)

    题意描述 给定两个升序排序有序数组A和B,以及一个目标值x。数组下标从0开始。 请你求出满足A[i] + B[j] = x数对(i, j)。 数据保证有唯一解。...输入格式 第一行包含三个整数n,m,x,分别表示A长度,B长度以及目标值x。 第二行包含n个整数,表示数组A。 第三行包含m个整数,表示数组B。...x,只需要在另一个数组中查找是否存在x-a[i],即可。...int t=x-a[i]; int l=0,r=m-1; if(search(l,r,t)) printf("%d %d\n",i,l); } } 2.指针...时间复杂度O(n) 由于数组是有序数组,所以对于B数组,我们只用从尾部开始遍历,如果两数之和相加大于x,则让指向另一个数组指针向前移一位,循环停止,说明a[i]+b[j]<=x,而因为是有序数组,对于对于当前

    59720

    【Android NDK 开发】JNI 方法解析 ( int 数组传递 | jintArray 类型 | 数组转换 | 获取数组长度 | 获取数组元素 | 指针遍历数组 | 数组返回设置 )

    intArray + k 是第 k 个元素首地址 使用 *(intArray + k) 可以获取第 k 个元素 */ for(int i = 0; i < len...; i ++){ //获取第 i 个元素首地址 , 使用 *num 可以获取第 i 个元素 int *num = intArray + i; /...那么最终 Java 层会被修改 如果设置 2 , 那么 如果修改了 int 数组 , 那么最终 Java 层不会被修改 IX ....操作 jint * 指针变量 , 循环获取数组中每个元素 /* 获取数组长度 函数原型 : jsize GetArrayLength(jarray array...; i < len; i ++){ //获取第 i 个元素首地址 , 使用 *num 可以获取第 i 个元素 int *num = intArray + i;

    2K10

    Leetcode977有序数组平方(指针解法)

    Leetcode977有序数组平方(指针解法) 题目 给你一个按 非递减顺序 排序整数数组 nums,返回 每个数字平方 组成数组,要求也按 非递减顺序 排序。...res.push(nums[right]*nums[right]) • right-- • } } return res.reverse() }; 解题思路: 我们中学时候都有学到曲线...,大家应该都知道x平方这条曲线怎么个走势吧,对于这道题而言,我们可以计算出对应数字平方,然后把它插入到数组中,如果左边平方大就左边+1如果右边平方大就右边-1这样我们可以知道所有的数全都求一个平方...,再把整个数组翻转过来就好了。...毕竟unshift方法操作数组是在最前面插个队,这样后面所有的都得往后挪一个,不如push操作,直接放在最后面,省得每个元素后移了。 有感兴趣可以试试两者之间差别哈。

    28000

    K 个不同整数数组指针

    题目 给定一个正整数数组 A,如果 A 某个子数组中不同整数个数恰好为 K,则称 A 这个连续、不一定独立数组为好子数组。...(例如,[1,2,3,1,2] 中有 3 个不同整数:1,2,以及 3。) 返回 A 中好子数组数目。...示例 1: 输入:A = [1,2,1,2,3], K = 2 输出:7 解释:恰好由 2 个不同整数组数组: [1,2], [2,1], [1,2], [2,3], [1,2,1], [2,1,2...示例 2: 输入:A = [1,2,1,3,4], K = 3 输出:3 解释:恰好由 3 个不同整数组数组: [1,2,1,3], [2,1,3], [1,3,4]....解题 参考官方思路 每次遍历一个右端点 r,以该右端点为结束满足题意数组有多少个 左端点有两个极限位置 l1, l2,[l1, r]刚好有 k 个不同数字,[l2, r] 刚好有 k-1 个不同数字

    64120

    指针团灭删除有序数组重复项系列

    又由于题目告知数组是 升序排列 ,因此可以通过 设置两个均指向数组第一个元素(从第零个元素开始算)指针(下标),一个用于遍历整个数组,另一个用于比较遍历整个数组指针指向数组元素是否等于该指针指向数组元素后一个元素... 指针法 去求解。...举栗 以 nums = [0, 1, 1, 2, 3, 3] 为栗子,如下图示: 1、设置 快慢指针 f/s 并均指向数组第一个元素。 image.png 2、nums[f] !...指针 方法,只不过本题是 比较 nums[s - 2](上上次放置元素) 跟 nums[f](当前遍历元素)大小。...} f++ } return s } 往期精彩回顾 汉明距离(位运算,清晰图解) 更多精彩 关注公众号【程序员小熊】,后台回复【算法】或【python】,即可获取高清无码经典算法或

    61010
    领券