題目來自:https://leetcode-cn.com/problems/3sum/description/
給定一個包含?n?個整數的數組nums,判斷nums中是否存在三個元素?a,b,c ,使得a + b + c =?0 ?找出所有滿足條件且不重復的三元組。
注意:答案中不可以包含重復的三元組。
例如, 給定數組 nums = [-1, 0, 1, 2, -1, -4],
滿足要求的三元組集合為:
[
? [-1, 0, 1],
? [-1, -1, 2]
]
思路:
? ? ? ? 這道題挺簡單的。
? ? ? ? 首先要明白一個三元組關系 a>=b>=i 所以首先就是把數組按從小到大重新排序。
? ? ? ? 了解?二元組的和等于給定值sum?情況的話,就知道數組排序后,用兩個指向數組的指針,一個從前向后掃描,一個從后向前掃描,記為first和last;
????????當 first + last == sum 則找到了一對二元組,它們的和等于sum;
????????如果 first + last < sum 則再去取左邊更大的值,所以 first++;
? ? ? ? 如果 first + last > sum 則再去取右邊更小的值,所以 last-- 。
????????同樣,三元組的情況,先將數組從小到大排序,然后固定一個元素 chooiseNum?,再去尋找一個二元組的和為sum + chooiseNum == 0 ,這樣就將三元組的問題,轉換成了二元組的問題。
private static int[] num = {-1, 0, 1, 2, -1, -4};
public static void main(String[] args) {
????????sortNums(num);
????????System.out.print("排序后的數組:");
????????for (int i = 0; i < num.length; i++) {
????????????????????System.out.print(num[i] + " ");
????????}
????????System.out.println(" ");
????????solutionThirdNum(num);
}
public static void solutionThirdNum(int[] nums) {
????????for (int i = 0; i< nums.length; i++) {
? ??????????????????int chooiseNum = nums[i];
????????????????????int left = 0, right = nums.length-1;
? ??????????????????while(left < right) {
? ??????????????????????????int sum = nums[left] + nums[right];
????????????????????????????if(i == left || i == right) {
????????????????????????????????????break;
????????????????????????????}
????????????????????????????if(chooiseNum + sum < 0) {
????????????????????????????????????left++;
????????????????????????????????????continue;????
????????????????????????????}
????????????????????????????if(chooiseNum + sum > 0) {
????????????????????????????????????right--;
????????????????????????????????????continue;
????????????????????????????}
????????????????????????????if(chooiseNum + sum == 0) {
????????????????????????????????????????if(left >= i ) {
????????????????????????????????????????System.out.println(" [ " + nums[i] + ","+? nums[left] +"," + nums[right] + " ]");
????????????????????????????????????????}
????????????????????????????????????????if(left < i && i < right) {
????????????????????????????????????????????System.out.println(" [ " + nums[left] + ","+? nums[i] +"," + nums[right] + " ]");
????????????????????????????????????????}
????????????????????????????????????????if(right <= i) {
????????????????????????????????????????????????System.out.println(" [ " + nums[left] + ","+? nums[right] +"," + nums[i] + " ]");
????????????????????????????????????????}
????????????????????????????????????????break;
????????????????????????????}
????????????????????}
????????}
}
// 冒泡排序--> 從小到大
public static int[] sortNums(int[] sortNum) {
????????????for (int i = 0; i < sortNum.length - 1; i++) {
????????????????????for (int j = 0; j < sortNum.length - i - 1; j++) {
????????????????????????????if (sortNum[j] > sortNum[j + 1]) {
????????????????????????????????int temp = sortNum[j];
????????????????????????????????sortNum[j] = sortNum[j + 1];
????????????????????????????????sortNum[j + 1] = temp;
????????????????????????????????}
????????????????????????}
????????????????}
????????????????return sortNum;
}