题解 | #旋转数组的最小数字#

和为S的两个数字

http://www.nowcoder.com/practice/390da4f7a00f44bea7c2f3d19491311b

O(N), 双指针

由于数组升序,左右指针指向首尾

左右指针相加大于sum,则右指针左移,小于sum,左指针右移使得相加等于sum

剪枝操作表示此次循环left和right指向的数值和上次循环相等,没有计算的必要,直接continue,当然也可以不用,但是这种操作可以去重(很重要),此题不要求去重,直接计算得到一个就跳出

此题有暴力解法,O(N2)

import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
    ArrayList<Integer> res = new ArrayList<>();
    //左右指针相加大于sum,则右指针左移,小于sum,左指针右移
    int left = 0;
    int right = array.length - 1;
    while(left < right){
        if(left > 0 && array[left] == array[left - 1]) {//剪枝
            left++;
            continue;
        }
        if(right < array.length - 1 && array[right] == array[right + 1]) {//剪枝
            right --;
            continue;
        }
        
        if(array[left] + array[right] > sum){
            right --;
        }else if(array[left] + array[right] < sum){
            left ++;
        }else{
            res.add(array[left]);
            res.add(array[right]);
            return res;
        }
    }
    
    return res;
}
}
全部评论

相关推荐

想问问各位大佬,同时拿到了美团和虾皮的前端实习,该怎么选呀?
寒小枫:实习选美团 秋招同薪资选虾皮
投递美团等公司10个岗位 >
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务