复杂的两数之和可以使用一个HashMap<Integer,ArrayList<Integer>>来保存数组中的值和索引,key是值,value是索引,然后遍历数组,如果HashMap.containsKey(target-nums[i])==false,就将值和索引添加到hashmap中,如果map中存在相同的key,就把索引添加到对应的arraylist中,如果没有就直接添加即可。如果HashMap.containsKey(target-nums[i])==true,就将key为target-nums[i]所对应的arraylist中的值与i进行一一匹配加入结果集即可,然后再将键值对加入hashmap中,遍历完就得到所有可能的下标组合。 交换礼物的话如果就那两个条件的话,我觉得 判断一下n为奇数还是偶数,如果是偶数,直接reverse一下就好了,如果是奇数,第一个人和第二个人交换礼物,然后剔除第一个人,剩下的n-1个人reverse一下不就行了吗