leetcode算法入门--双指针(二)

283.移动零

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。

输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]
输入: nums = [0]
输出: [0]

方法一.
从右向左扫描,当扫描到0时,利用交换的方法将所有的0转换到数组尾部
eg:

1 2 0 5 6
1 2 5 0 6
1 2 5 6 0

class Solution {
    public void moveZeroes(int[] nums) {
        int n=nums.length-1;
        int count=0;
        for(int i=n;i>=0;i--)
        {
            if(nums[i]==0)
            {
                for(int j=i;j<n-count;j++)
                {
                    int mid=nums[j+1];
                    nums[j+1]=nums[j];
                    nums[j]=mid;
                }
                count++;
            }
        }
    }
}

但是这种方法显然与双指针没啥关系,而且效率极为低下。

方法二.利用双指针中的快慢指针的方法来进行
这种方法的思想时利用一个快指针去遍历数组,然后将其中非0的元素赋值给慢指针所处的位置,即用慢指针指示非零数字的个数。
代码如下

	class Solution {
    public void moveZeroes(int[] nums) {
      int fast=0,slow=0;
      for(fast=0;fast<nums.length;fast++)
      {
          if(nums[fast]!=0)
          {
              nums[slow]=nums[fast];
              slow++;
          }
      }
      while(slow<nums.length)
      {
          nums[slow]=0;
          slow++;
      }

}
}

167. 两数之和 II - 输入有序数组

给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列  ,请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] ,则 1 <= index1 < index2 <= numbers.length 。
以长度为 2 的整数数组 [index1, index2] 的形式返回这两个整数的下标 index1 和 index2。
你可以假设每个输入 只对应唯一的答案 ,而且你 不可以 重复使用相同的元素。你所设计的解决方案必须只使用常量级的额外空间。
样例如下

输入:numbers = [2,7,11,15], target = 9
输出:[1,2]
解释:27 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。返回 [1, 2] 。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/two-sum-ii-input-array-is-sorted
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

本题我的思路较为明确,由于数组是升序排列的所以对于一个数组

//[a,b,c,d,e] target=k
//由两个指针分别指向数组头和尾
//假设b+c=k
//a+e>k时,由于a<b<c<d<e为了向k靠拢只能将指向e的指针指向比e小的数即尾指针--,同理若 a+e<k,那么也只能令头指针++
//最后总结代码如下
class Solution {
    public int[] twoSum(int[] numbers, int target) {
        int left=0,right=numbers.length-1;
        int []result=new int[2];
        while(left<right)
        {
            int mid=numbers[left]+numbers[right];
            if(mid==target)
            {
                result[0]=left+1;
                result[1]=right+1;
                break;
            }
            else if(mid >target) right--;
            else if(mid<target) left++;
        }
        return result;
    }
}
posted @   比奇堡的黄色小海绵  阅读(17)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示