454. 四数相加 II
不会写,没思路
1.先判断两个数组中各种和的次数,和存为键,次数存为值
2.再寻找0-另外两个数组的和的
public int FourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
Dictionary<int,int> map=new Dictionary<int,int>();
int num=0;
for(int i=0;i<nums1.Length;i++){
for(int j=0;j<nums1.Length;j++){
int sum=nums1[i]+nums2[j];
if(map.ContainsKey(sum)){
map[sum]++;
}else{
map[sum]=1;
}
}
}
for(int i=0;i<nums1.Length;i++){
for(int j=0;j<nums1.Length;j++){
int sum=0-(nums3[i]+nums4[j]);
if(map.ContainsKey(sum)){
num+= map[sum];
}
}}
return num;
}
383. 赎金信
没思路,参考字母异位的那道题才写出来
public bool CanConstruct(string ransomNote, string magazine) {
int[] result=new int[26];
for(int i=0;i<magazine.Length;i++){
result[magazine[i]-97]++;
}
for(int j=0;j<ransomNote.Length;j++){
result[ransomNote[j]-97]--;
}
for(int i=0;i<26;i++){
if(result[i]<0){
return false;
}
}
return true;
}
- 三数之和
public bool CanConstruct(string ransomNote, string magazine) {
int[] result=new int[26];
for(int i=0;i<magazine.Length;i++){
++result[magazine[i]-97];
}
for(int j=0;j<ransomNote.Length;j++){
int index=ransomNote[j]-97;
if((--result[index])<0){//这种写法一定要注意将--写在前面,不然会比较完再进行--
return false;
}
}
return true;
}
一开始用哈希表写想破脑袋也没想出来
指针法也没写对TAT
public IList<IList<int>> ThreeSum(int[] nums) {
IList<IList<int>> result = new List<IList<int>>();
//将数组进行排序 从小到大
Array.Sort(nums);
for(int i=0;i<nums.Length;i++){
if(nums[i]>0) break;//大于0就跳出整个循环,因为必须满足三个数之和=0,而此时数组是递增的,后面的数比前面的数更大
if(i > 0 && nums[i] == nums[i-1])continue;//如果与前一个数相等,就跳过本次循环,如果不跳过那么最后的数组就会重复
int left=i+1;
int right=nums.Length-1;//不能放外面,因为当i往后遍历时,right必须为初始值,不能被上一次的值影响
while(left<right){
int sum=nums[i]+nums[left]+nums[right];
if(sum==0){
result.Add(new List<int>{nums[i],nums[left],nums[right]});
while(left<right&&nums[left]==nums[left+1])//如果后一个与这个相同,那就移到到后一个
left++;
while(left<right&&nums[right] == nums[right-1])
right--;
left++;//将left左移一个,要确保移动后的值不同,不然就是白移
right--;
}else if(sum < 0)
left++;
else if(sum > 0)
right--;
}
}
return result;
}
public IList<IList<int>> FourSum(int[] nums, int target)
{
Array.Sort(nums);
IList<IList<int>> result = new List<IList<int>>();
for (int i = 0; i < nums.Length; i++)
{
if (i > 0 && nums[i] == nums[i - 1]) continue;
for (int j = i+1; j < nums.Length-2; j++)
{
if (j>i+1 && nums[j] == nums[j - 1]) continue;
int left = j + 1;
int right =nums.Length - 1;
while (left < right)
{
long sum = (long )nums[i]+ (long )nums[j] + (long )nums[left] + (long )nums[right];//注意不能定义为int,可能会超出范围
if (sum == target)
{
result.Add(new List<int>() { nums[i] , nums[j] , nums[left] , nums[right] });
while(left < right && nums[right] == nums[right - 1]) { right--; }//只要改变left或者right任意一个,让它不与上一组相等即可
right--;
}else if (sum < target)
{
left++;
}
else
{
right--;
}
}
}
}
return result;
}
}