給定一個(gè)包含 n 個(gè)整數(shù)的數(shù)組 nums,判斷 nums 中是否存在三個(gè)元素 a,b,c ,使得 a + b + c = 0 ?找出所有滿足條件且不重復(fù)的三元組。

背景

最近在找機(jī)會,大廠面試避免不了算法,回來和同事討論,給我推薦了一個(gè)https://leetcode-cn.com/store/網(wǎng)站,上面有許多算法題,大家有事沒事可以看看,提高一下邏輯思維能力

題目

給定一個(gè)包含 n 個(gè)整數(shù)的數(shù)組 nums,判斷 nums 中是否存在三個(gè)元素 a,b,c ,使得 a + b + c = 0 ?找出所有滿足條件且不重復(fù)的三元組。
注意:答案中不可以包含重復(fù)的三元組。

例如, 給定數(shù)組 nums = [-1, 0, 1, 2, -1, -4],
滿足要求的三元組集合為:
[
[-1, 0, 1],
[-1, -1, 2]
]

解決思路

1.現(xiàn)將數(shù)組排序,方便后面計(jì)算和及返回?cái)?shù)組去重
2.計(jì)算3個(gè)數(shù)字之和其實(shí)是兩個(gè)數(shù)字子和的變種
a[i]+a[j]+a[k] = 0 轉(zhuǎn)化為a[i]+a[j] = -a[k]
3.數(shù)組有序,通過第一項(xiàng)i固定,j = i+1,k=n-1[n為數(shù)組的長度]
a[i]+a[j]+a[k] > 0 k--
a[i]+a[j]+a[k] < 0 j++
4.循環(huán)計(jì)算a[i],a[j],a[k],循環(huán)的條件為j<k
5.二維數(shù)組去重
通過定義一個(gè)空對象,key的值為二維數(shù)組的每一個(gè)元素項(xiàng)即一維數(shù)組的每一個(gè)元素組成的字符串,判斷對象中是否存在該key,如果不存在,將該以為數(shù)組獲取到

代碼實(shí)現(xiàn)

var threeSum = function (nums) {
            if(nums.length<3){
                return []
            }
            //放數(shù)組的容器
            var result = [];
            var lastResult = [];
            // 1,對數(shù)組排序從小到大
            nums.sort(function (a, b) {
                return a - b;
            })
            //計(jì)算兩個(gè)數(shù)的和變種[使用雙重循環(huán),a[0]+a[1]+a[n-1]]
            // 如果a[0]+a[1]+a[n-1]>0 k--
            // 如果a[0]+a[1]+a[n-2]<0 j++
            var flag = nums.every(function(ele){
                return ele === 0
            })
            if(flag){
                return [[0,0,0]]
            }
            for (var i = 0, n = nums.length; i < n - 2; i++) {
                var j = i + 1;
                var k = n - 1;
                var statm = []
                while (j < k) {
                    var temp = [];
                    var sum_two = nums[i] + nums[j];
                    if (sum_two + nums[k] > 0) {
                        k--;
                    } else if (sum_two + nums[k] < 0) {
                        j++
                    } else {
                        temp = [nums[i], nums[j], nums[k]]
                        result.push(temp);
                        //尋找下一組
                        j++;
                        k--;
                    }

                }
            }
            lastResult = unique(result);
            return lastResult;
        };
        function unique(arr){
            var result = [];
            var cache = {}
            for(var i = 0;i< arr.length;i++){
                var key = '';
                for(var j = 0;j<arr[i].length;j++){
                    key += `${arr[i][j]}`
                }
                if(!cache[key]){
                    cache[key] = 1;
                    result.push(arr[i])
                }
            }
            return result
        }
        console.log(threeSum([-1, 0, 1, 2, -1, -4]));
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容