leetcode 37——较小的三数和,两个只出现一次的数字,无环图,重构回文字符串

leetcode 259:
给定一个长度为 n 的整数数组和一个目标值 target,寻找能够使条件 nums[i] + nums[j] + nums[k] < target 成立的三元组 i, j, k 个数(0 <= i < j < k < n)。
示例:
输入: nums = [-2,0,1,3], target = 2
输出: 2
解释: 因为一共有两个三元组满足累加和小于 2:
[-2,0,1]
[-2,0,3]

class Solution {
public int threeSumSmaller(int[] nums, int target) {
if(nums.length<3)return 0;
Arrays.sort(nums);
int result=0;
for(int i=0;i<nums.length-2;i++){
int left=i+1,right=nums.length-1;
while(left<right){
if(nums[left]+nums[right]>=target-nums[i])right–;
else{
result+=right-left;
left++;right=nums.length-1;
}
}
}
return result;
}
}

leetcode:260
给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。
示例 :
输入: [1,2,1,3,2,5]
输出: [3,5]
注意:

class Solution {
public int[] singleNumber(int[] nums) {
int xor = 0;
for (int i : nums)// 一样的抵消,不一样的两个数字异或运算结果必定有一位是1
xor ^= i;
int mask = xor & (-xor);
int[] ans = new int[2];
for (int i : nums) {
if ((i & mask) == 0)//== 0、 == mask 两种结果
ans[0] ^= i;
else
ans[1] ^= i;
}
return ans;
}
}

leetcode :261
给定从 0 到 n-1 标号的 n 个结点,和一个无向边列表(每条边以结点对来表示),请编写一个函数用来判断这些边是否能够形成一个合法有效的树结构。

示例 1:
输入: n = 5, 边列表 edges = [[0,1], [0,2], [0,3], [1,4]]
输出: true
示例 2:
输入: n = 5, 边列表 edges = [[0,1], [1,2], [2,3], [1,3], [1,4]]
输出: false
注意:你可以假定边列表 edges 中不会出现重复的边。由于所有的边是无向边,边 [0,1] 和边 [1,0] 是相同的,因此不会同时出现在边列表 edges 中。

解析:主要正常的宽度优先遍历只用记录节点。因为使用的是TreeNode或者邻接矩阵或邻接表。我们这里只有表示边的数组,所以还要对边进行记录防止遍历重复边

class Solution {
int flagNode[];
int flagEdge[];
public boolean validTree(int n, int[][] edges) {
flagNode=new int [n];
flagEdge=new int [edges.length];
flagNode[0]=1;
if(DFS(0,edges)==false)return false;
for(int i=0;i<n;i++)if(flagNode[i]==0)return false;
return true;
}
public boolean DFS(int root,int[][] edges){
for(int i=0;i<edges.length;i++){
if(flagEdge[i]==1)continue;
if(edges[i][1]==root||edges[i][0]==root){
flagEdge[i]=1;
int j=edges[i][0]==root?edges[i][1]:edges[i][0];
if(flagNode[j]==1)return false;
flagNode[j]=1;
if(DFS(j,edges)==false)return false;
}
}
return true;
}
}

leetcode266
给定一个字符串,判断该字符串中是否可以通过重新排列组合,形成一个回文字符串。

示例 1:
输入: “code”
输出: false
示例 2:
输入: “aab”
输出: true
示例 3:
输入: “carerac”
输出: true
解法一:map 注意map.getOrDefault(s.charAt(i), 0) + 1)
public class Solution {
public boolean canPermutePalindrome(String s) {
HashMap < Character, Integer > map = new HashMap < > ();
for (int i = 0; i < s.length(); i++) {
map.put(s.charAt(i), map.getOrDefault(s.charAt(i), 0) + 1);
}
int count = 0;
for (char key: map.keySet()) {
count += map.get(key) % 2;
}
return count <= 1;
}
}

解法二:集合 Set < Character > set = new HashSet < > ();
add remove
public class Solution {
public boolean canPermutePalindrome(String s) {
Set < Character > set = new HashSet < > ();
for (int i = 0; i < s.length(); i++) {
if (!set.add(s.charAt(i)))
set.remove(s.charAt(i));
}
return set.size() <= 1;
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值