天天看點

LeetCode 雙指針

1 有序數組,兩個數的和等于target

//有序數組,兩個數的和等于target
public int[] twoSum(int[] number,int target){
	
	if(number == null ) return null;
	int i = 0; j = number.length-1;

	while(i<j){
		int sum = number[i] + number[j];
		if(sum == target){
			return new int[]{i+1, j+1};
		}
		else if (sum < target){
			i++
		}
		else{
			j--;
		}
	}

	return null
}
           

2 兩個數的平方和:判斷一個非負整數是不是兩個整數的平方和

//兩個數的平方和:判斷一個非負整數是不是兩個整數的平方和
public boolean judgeSquareSum(int target){

        if(target < 0)
        	return false;
        int i,j=(int)Math.sqrt(target);
        for(i< = j){
        	int sum = i*i + j*j;
        	if(sum == target){
        		return true;
        	}
        	else if(sum<target){
        		i++;
        	}
        	else{
        		j--;
        	}
        }
        return falase;
    }
           

3 反轉字元串中的元音字元

//反轉字元串中的元音字元
private final static HashSet<Character> vowels = new HashSet(Arrays.asList('a','e','i','o','u','A','E','I','O','U'))

public String reverse(Srting s){

	if(s == null)
		return null;
	int i=0,j=s.length()-1;
	char[] result = new char[s.length()];
	while(i < = j){
        char c1 = s.charAt(i);
        char c2 = s.charAt(j);
        if(!vowels.contains(c1)){
        	resule[i++] = c1;
        }
        else if(!vowels.contains(c2)){
        	resule[j--] = c2;
        }
        else{
        	result[i++] = c2;
        	result[j--] = c1;
        }
	}
	return new String(result);

}
           

4 删除一個字元 判斷是不是回文字元串

//删除一個字元 判斷是不是回文字元串


public Boolean validPalindrome(Srting s){

	int i=0; j = s.length()-1;

	for(int i=0; j = s.length()-1; i < j;){
	if(s.charAt(i)!=s.charAt(j))
		return ( isHyuWen(s,i+1,j)||isHyuWen(s,i,j-1) );
	else{
		i++;
	    j--;
	}
}
    return true;
}

private boolean isHyuWen(String s, int i,int j){
	while(i<j){
		if(s.charAt(i++) != s.charAt(j--))
			return false;
	}

	return true
}
           

5 歸并兩個有序數組

// 歸并兩個有序數組
public void merge(int[] nums1,int m,int[] nums2,int n){

	int result[] = new result[m+n];
	int i=0,j=0,k=0;
	while(i<m-1 && j<n-1){
		if(nums[i] <= nums[j]){
           result[k++] = nums1[i];
           i++;
		}
		else{
			result[k++] = nums2[j];
            j++
		}

	}
	
	if(i < m){
		 result[k++] = nums1[i];
           i++;
	}
	if(j < n){
		 result[k++] = nums2[j];
         j++;
	}

}
           
// 歸并兩個有序數組
public void merge(int[] nums1,int m,int[] nums2,int n){

	int index1 = m -1 , index2 = n -1;
	int mergeindex=m+n-1;
	while(index1 >= 0 || index2 >=0){

         if(nums1[index1] < nums2[index2]){
              nums1[mergeindex--] = nums2[index2--];
         }
          if(nums1[index1] > nums2[index2]){
              nums1[mergeindex--] = nums1[index1--];
         }
         if(index1<0){
         	nums1[mergeindex--] = nums2[index2--];
         }
          if(index2<0){
         	nums1[mergeindex--] = nums1[index1--];
         }
	}

}
           

6 判斷連結清單是否存在環

// 判斷連結清單是否存在環
public boolean hasCycle(ListNode head){

    ListNode l1 = head.next,l2=l1.next;
	if(head=null){
		return false;
	}
	while(l1!=null&&l2!=null&l2.next!=null){
		if(l1 == l2){
			return true;
		}
        l1 = l1.next;
        l2=l2.next.next;
	}
	return false;
}