給你乙個包含 n 個整數的陣列 nums,判斷 nums 中是否存在三個元素 a,b,c ,使得 a + b + c = 0 ?請你找出所有滿足條件且不重複的三元組。
注意:答案中不可以包含重複的三元組。
示例:給定陣列 nums = [-1, 0, 1, 2, -1, -4],
滿足要求的三元組集合為:
[[-1, 0, 1],
[-1, -1, 2]
]【題解】
本題實際上為兩個元素為定值的乙個公升級版。同時求兩個元素為定值又分已排序的陣列和未排序的陣列。
已排序陣列:
一次迴圈,不用借助map。假設為從小到大排序陣列,頭元素索引begin,尾元素索引end。不斷比較begin+end 和target的值,begin+endtarget,讓end--。同時注意去重即可。例如nums[begin] == nums[begin--]或nums[end]==nums[end+1]就continue
未排序陣列:
1、暴力查詢,2個for
2、借助map表,迴圈1次查詢滿足a+b=target的陣列。
對於本題,因為為3個數相加a+b+c=0的情況,
暴力法為o(n^3),顯然恐怖。所以可以直接排序,時間負責度o(n*logn),
再對排序後的陣列,實行上述對於已排序陣列尋找 a+b=target的解法即可。
//(nums[begin] == nums[begin-1] && begin>i+1)
//這一段是再提交過程中發現這類特例會出錯。例如nums=[0,0,0,0] 會輸出2組[0,0,0]
所以需要比較nums[begin] 和nums[begin-1],當begin++後。如果發現nums[begin] 和nums[begin-1]相等,即跳過。而begin>i+1是為了防止越界,因為需要比較的數中有乙個為nums[begin-1]
//類似兩個數求和=target,3個數求和為0,相當於target是變化的。
//先排序,這樣可以去掉重複的target。畢竟排序時間複雜度也就o(n*logn)
//同時排序後,對於有序陣列找target的。2333。前後同是便利即可。
vector> threesum(vector& nums) ;
vector> res;
int n = nums.size();
sort(nums.begin(),nums.end());//先排序
for(int i = 0; i < n; i++) );
begin++;}}
}return res;
}
面試題 回文數
一次面試時要求在紙上寫出回文數的 判斷乙個整數是否是回文數,是返回1,否則返回0 public static int ishuiwen int num else int n getlength num 取整數的左邊0 middle位和右邊的0 middle位進行對應比較 int middle n 2...
面試題 醜數
我們把只包含因子2 3和5的數稱為醜數 ugly number 求按從大到小的順序的第1500個醜數。例如,6 8都是醜數,但14不是,因為它包含因子7。習慣上我們把1當作第1個醜數。思路 先來乙個由定義得到的演算法,再看看有沒有優化空間。bool isugly int number while n...
面試題 數倉
如何判定乙個表是事實表還是維度表?資料建模過程說一下?三正規化緩慢變化維處理方式?什麼也不該,保留原始值 直接覆蓋 增加新行,需要為新航分配新的 鍵 增加新屬性列 增加微型維度 某些維度屬性變化較快導致維度表越來越大可以把這些屬性柴麗出來單獨構建微型維度表 雙重外來鍵並且方式1與方式2結合 在方式2...