算法-数组|704.二分查找、35.搜索插入的位置 34. 在排序数组中查找元素的第一个和最后一个位置 69. x 的平方根 27.移除元素 26. 删除有序数组中的重复项 283. 移动零...

一、 LeetCode 704 二分查找

题目连接: https://leetcode.cn/problems/binary-search/
思路:使用两个变量定义左右边界,如[left, right] 使tartget和mid的位置的比较,比mid位置的值大,则说明target在右区间,既修改left = mid + 1; 如果target比mid位置的值小,则说明target在左区间,既修改right = mid - 1;如果相等则返回mid的索引。都没找到则返回-1;

定义[left, right]区间查找
class Solution {
    public int search(int[] nums, int target) {
        if (nums == null || nums.length == 0) return -1;
        int left = 0;
        int right = nums.length - 1;
        while (left <= right) {
            int mid = left + (right - left) /  2;
            if (target > nums[mid]) {
                left = mid + 1;
            } else if (target < nums[mid]) {
                right = mid - 1;
            } else {
                return mid;
            }
        }
        return -1;
    }
}
使用[left, right)
class Solution {
    public int search(int[] nums, int target) {
        if (nums == null || nums.length == 0) return -1;
        if (target < nums[0] || target > nums[nums.length - 1]) return -1;
        int left = 0;
        int right = nums.length;
        while (left < right) {
            int mid = left + (right - left) / 2;
            if (target > nums[mid]) {
                left = mid + 1;
            } else if (target < nums[mid]) {
                right = mid;
            } else {
                return mid;
            }
        }
        return -1;
    }
}

二、 LeetCode 35 搜索插入的位置

题目连接: https://leetcode.cn/problems/search-insert-position/
思路:使用二分查找[left, right),找到了既mid位置的值,没有找到则返回right的位置索引

class Solution {
    public int searchInsert(int[] nums, int target) {
        if (target < nums[0]) return 0;
        if (target > nums[nums.length - 1]) return nums.length;
        int left = 0;
        int right = nums.length;
        while (left < right) {
            int mid = left + (right - left) / 2;
            if (target > nums[mid]) {
                left = mid + 1;
            } else if (target < nums[mid]) {
                right = mid;
            } else {
                return mid;
            }
        }
        return right;
    }
}

三、LeetCode 34 在排序数组中查找元素的第一个和最后一个位置

题目连接:https://leetcode.cn/problems/find-first-and-last-position-of-element-in-sorted-array/
思路:使用二分查找法找到target的索引,如果为找到返回[-1, -1],如果找到了index,在分别向左边循环查找左边界,向右边循环查找右边界

class Solution {
    private int binarySearch(int[] nums, int target){
        int left = 0;
        int right = nums.length - 1;
        while (left <= right) {
            int mid = left + (right - left) / 2;
            if (nums[mid] > target) {
                right = mid - 1;
            } else if (nums[mid] < target) {
                left = mid + 1;
            } else {
                return mid;
            }
        }
        return -1;
    }
    public int[] searchRange(int[] nums, int target) {
        if (nums == null || nums.length == 0) return new int[]{-1, -1};
        if (target < nums[0] || target > nums[nums.length - 1]) return new int[]{-1, -1};
        int index = binarySearch(nums, target);
        if (index == -1) return new int[]{-1, -1};
        int left = index;
        int right = index;
        while (left - 1 >= 0 && (nums[left - 1] == nums[index])) {
            left--;
        }
        while (right + 1 <= nums.length - 1 && (nums[right + 1] == nums[index])) {
            right++;
        }
        return new int[]{left, right};
    }
}

四、 69. x 的平方根

题目连接:https://leetcode.cn/problems/sqrtx
思路:使用二分查找法分别尝试[0, x /2] ,相等的mid返回,不相等的最后取出right值返回

class Solution {
    public int mySqrt(int x) {
        if (x == 0 || x == 1) return x;
        int left = 1;
        int right = x / 2;
        while (left <= right) {
            int mid = left + (right - left) / 2;
            if (mid > x / mid) {
                right = mid - 1;
            } else if (mid < x / mid) {
                left = mid + 1;
            } else {
                return mid;
            }
        }
        return right;
    }
}

五、 367. 有效的完全平方数

题目连接:https://leetcode.cn/problems/valid-perfect-square/
思路:使用二分查找法,如果num / mid == mid并且没有余数则返回true

class Solution {
   public boolean isPerfectSquare(int num) {
       if (num == 0 || num == 1) return true;
       int left = 1;
       int right = num / 2;
       while (left <= right) {
           int mid = left + (right - left) / 2;
           if (mid > num / mid) {
               right = mid - 1;
           } else if (mid < num / mid) {
               left = mid + 1;
           } else {
               if (num % mid == 0) {
                   return true;
               } else {
                   return false;
               }
           }
       }
       return false;
   }
}

另一种写法:使用mid * mid == num判断,注意left, right ,mid, temp可能会超过int的最大值 因此使用long定义变量

class Solution {
    public boolean isPerfectSquare(int num) {
        long left = 0;
        long right = num;
        while (left <= right) {
            long mid = left + (right - left) / 2;
            long temp = mid * mid;
            if (temp > num) {
                right = mid - 1;
            } else if (temp < num) {
                left = mid + 1;
            } else {
                return true;
            }
        }
        return false;
    }
}

六、 27. 移除元素

题目连接:https://leetcode.cn/problems/remove-element/
思路:定义快慢指针,在快指针里搜索非val的值更新到slow指针的数组里面

class Solution {
    public int removeElement(int[] nums, int val) {
        if (nums == null || nums.length == 0) return 0;
        int slowIndex = 0;
        for (int fastIndex = 0; fastIndex < nums.length; fastIndex++) {
            if (nums[fastIndex] != val) {
                nums[slowIndex++] = nums[fastIndex];
            }
        }
        return slowIndex;
    }
}

七、26. 删除有序数组中的重复项

题目连接:https://leetcode.cn/problems/remove-duplicates-from-sorted-array/
思路:使用快慢指针,快指针和慢指针指的内容不相等,即和以前的元素不一样的时候,slow++ 在更新slow内容

class Solution {
    public int removeDuplicates(int[] nums) {
        int slowIndex = 0;
        for (int fastIndex = 1; fastIndex < nums.length; fastIndex++) {
            if (nums[slowIndex] != nums[fastIndex]) {
                nums[++slowIndex] = nums[fastIndex];
            }
        }
        return slowIndex + 1;
    }
}

八、283. 移动零

题目连接:https://leetcode.cn/problems/move-zeroes/
思路:使用快慢指针,使得非0的数字移动到左边,剩下的slowIndex后面的都重置成0

class Solution {
    public void moveZeroes(int[] nums) {
        if (nums == null || nums.length == 0) return;
        int slowIndex = 0;
        for (int fastIndex = 0; fastIndex < nums.length; fastIndex++){
            if (nums[fastIndex] != 0) {
                nums[slowIndex++] = nums[fastIndex];
            }
        }
        for (int i = slowIndex; i < nums.length; i++) {
            nums[i] = 0;
        }
    }
}

九、844. 比较含退格的字符串

题目连接:https://leetcode.cn/problems/backspace-string-compare/
思路:1、使用栈结构特性,遇到'#'弹出最后一个元素(注意判断栈是否为空),遇到非'#'就入栈,最后一次弹出栈得到的字符串做比较,这里可以使用StringBuilder模拟入栈(append)出栈(deleteCharAt)操作
2、使用双指针,从字符串的后面向前遍历,遇到'#'计数+1,不是'#'计数-1,直到计数等于0停止下来,比较两个位置的字符是否相等,不相等则返回false,相等i-- j--继续比较,如果遍历结束了既i < 0 || j < 0 则退出while(true) 判断两个是否到遍历完了,都遍历完了则返回true

1、使用栈的方式
class Solution {
    private String getString(String s) {
        if (s == null ||s.length() == 0) return s;
        StringBuilder stringBuilder = new StringBuilder();
        for (int i = 0; i < s.length(); i++){
            char c = s.charAt(i);
            if (c == '#') {
                if (stringBuilder.length() != 0) {
                    stringBuilder.deleteCharAt(stringBuilder.length() - 1);
                }
            } else {
                stringBuilder.append(c);
            }
        }
        return stringBuilder.toString();
    }
    public boolean backspaceCompare(String s, String t) {
        return getString(s).equals(getString(t));
    }
}
2、使用双指针
class Solution {
    public boolean backspaceCompare(String s, String t) {
        int i = s.length() - 1;
        int j = t.length() - 1;
        int sNumber = 0;
        int tNumber = 0;
        while (true) {
            while (i >= 0) {
                if (s.charAt(i) == '#') sNumber++;
                else {
                    if (sNumber > 0) sNumber--;
                    else break;
                }
                i--;
            }
            while (j >= 0) {
                if (t.charAt(j) == '#') tNumber++;
                else {
                    if (tNumber > 0) tNumber--;
                    else break;
                }
                j--;
            }
            if (i < 0 || j < 0) break;
            if (s.charAt(i) != t.charAt(j)) return false;
            i--;
            j--;
        }
        return i == -1 && j == -1;
    }
}

十、977. 有序数组的平方

题目连接:https://leetcode.cn/problems/squares-of-a-sorted-array/
思路:使用首尾指针,取平方最大的值放在结果集的最右边

class Solution {
    public int[] sortedSquares(int[] nums) {
        int left = 0;
        int right = nums.length - 1;
        int[] result = new int[nums.length];
        int j = result.length - 1;
        while (left <= right) {
            int leftValue = nums[left] * nums[left];
            int rightValue = nums[right] * nums[right];
            if (leftValue > rightValue) {
                result[j--] = leftValue;
                left++;
            } else {
                result[j--] = rightValue;
                right--;
            }
        }
        return result;
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容