leetcode双指针
Question1(leetcode 283):
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序
class Solution {
public void moveZeroes(int[] nums) {
for(int i=0;i<nums.length-1;i++)
{
for(int j=0;j<nums.length-i-1;j++)
{
if(nums[j]==0)
{
int temp=nums[j];
nums[j]=nums[j+1];
nums[j+1]=temp;
}
}
}
return ;
}
}
执行用时:64 ms, 在所有 Java 提交中击败了5.17%的用户
内存消耗:38.7 MB, 在所有 Java 提交中击败了42.95%的用户
采用冒泡排序进行处理。比较复杂
class Solution {
public void moveZeroes(int[] nums) {
int n = nums.length, left = 0, right = 0;
while (right < n) {
if (nums[right] != 0) {
swap(nums, left, right);
left++;
}
right++;
}
}
public void swap(int[] nums, int left, int right) {
int temp = nums[left];
nums[left] = nums[right];
nums[right] = temp;
}
}
采用双指针的方法,把右侧的指针对应的非零数依次移动到左指针。
执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户
内存消耗:38.4 MB, 在所有 Java 提交中击败了85.82%的用户
Question2(leetcode 167):
给定一个已按照 升序排列 的整数数组 numbers ,请你从数组中找出两个数满足相加之和等于目标数 target 。
class Solution {
public int[] twoSum(int[] numbers, int target) {
for(int i=1;i<=numbers.length;i++)
{
for(int j=i+1;j<=numbers.length;j++)
{
if(numbers[i-1]+numbers[j-1]==target)
return new int[]{i,j};
}
}
return new int[]{-1,-1};
}
}
执行用时:233 ms, 在所有 Java 提交中击败了6.64%的用户
内存消耗:38.9 MB, 在所有 Java 提交中击败了7.23%的用户
总结:这个算法时间复杂度为O(n^2),
class Solution {
public int[] twoSum(int[] numbers, int target) {
int q=1;
while(q<numbers.length)
{
int p=0;
if(numbers[p]+numbers[q]==target)
{
return new int[]{p+1,q+1};
}
while(numbers[q]+numbers[p]<=target&&p+1<q)
{
p++;
if(numbers[p]+numbers[q]==target)
return new int[]{p+1,q+1};
}
q++;
}
return new int[]{-1,-1};
}
}
执行用时:102 ms, 在所有 Java 提交中击败了11.46%的用户
内存消耗:38.3 MB, 在所有 Java 提交中击败了94.81%的用户
利用双指针,但设计或许不够好,执行用时没有显著提升。
查看答案得:
在这里插入代码片