【每日一题】 1785. 构成特定和需要添加的最少元素
题目描述
给你一个整数数组 nums ,和两个整数 limit 与 goal 。数组 nums 有一条重要属性:abs(nums[i]) <= limit 。
返回使数组元素总和等于 goal 所需要向数组中添加的最少元素数量 ,添加元素 不应改变 数组中 abs(nums[i]) <= limit 这一属性。
输入:nums = [1,-1,1], limit = 3, goal = -4
输出:2
解释:可以将 -2 和 -3 添加到数组中,数组的元素总和变为 1 - 1 + 1 - 2 - 3 = -4 。
题目解析
【贪心】:每次添加的数,都是最大的数,可以保证添加的数量最少。
class Solution {
public int minElements(int[] nums, int limit, int goal) {
//计算目前nums总和 long!
long sum = 0;
for (int x : nums) {
sum += x;
}
//计算差值:long
long diff = Math.abs(goal - sum);
//贪心算法 每次都补充 最大的 数
// 向上取整!
return (int) ((diff + limit - 1) / limit);
}
}
【leetcode hot 100】142. 环形链表 II
题目描述
给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
输入:head = [3,2,0,-4], pos = 1
输出:返回索引为 1 的链表节点
解释:链表中有一个环,其尾部连接到第二个节点
题目解析
【判断是否有环】:使用快慢指针,fast指针每次走两步,slow指针每次走一步。如果两者可以相遇,则说明有环。
【判断相交点】:分别从头节点、慢指针开始,向后遍历,相遇点为相交点。
public class Solution {
public ListNode detectCycle(ListNode head) {
//判断是否有环
if(head == null) return null;
ListNode fast = head, slow = head;
while(true){
if((fast == null || fast.next == null)) return null;
fast = fast.next.next;
slow = slow.next;
if(fast == slow) break;
}
ListNode cur = head;
while(cur != slow){
cur = cur.next;
slow = slow.next;
}
return cur;
}
}
【代码随想录】93. 复原 IP 地址
题目描述
有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 ‘.’ 分隔。
给定一个只包含数字的字符串 s ,用以表示一个 IP 地址,返回所有可能的有效 IP 地址,这些地址可以通过在 s 中插入 ‘.’ 来形成。你 不能 重新排序或删除 s 中的任何数字。你可以按 任何 顺序返回答案。
输入:s = “25525511135”
输出:[“255.255.11.135”,“255.255.111.35”]
题目解析
class Solution {
List<String> res = new ArrayList<>();
StringBuffer element = new StringBuffer();
public List<String> restoreIpAddresses(String s) {
if(s.length() > 12 && s.length() < 4) return res;
dfs(s, 0, 0);
return res;
}
public void dfs(String s, int index, int num){
if(num == 4){
if(index == s.length()){
res.add(element.toString());
}
return;
}
String sb = "";
for(int i = index; i < Math.min(s.length(), index + 3); i++){
sb += s.charAt(i);
int temp = Integer.parseInt(sb);
int point = 0;
if(temp <= 255 && s.length() - i <= 10){
element.append(sb);
if(num < 3){
element.append(".");
point += 1;
}
dfs(s, i + 1, num + 1);
element.delete(element.length() - sb.length() - point, element.length());
}
if(temp == 0) break;
}
}
}